/*
 * SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package fixtures

import "github.com/dynemo-ai/dynemo/deploy/compoundai/api-server/api/schemas"

func DefaultCreateClusterSchema() schemas.CreateClusterSchema {
	return schemas.CreateClusterSchema{
		Description: "description",
		KubeConfig:  "",
		Name:        "default",
	}
}

func DefaultUpdateClusterSchema() schemas.UpdateClusterSchema {
	d := "description"
	kc := "kubeconfig"
	return schemas.UpdateClusterSchema{
		Description: &d,
		KubeConfig:  &kc,
	}
}

func DefaultListQuerySchema() schemas.ListQuerySchema {
	return schemas.ListQuerySchema{
		Start:  0,
		Count:  20,
		Search: nil,
	}
}

// DefaultCreateDeploymentSchema generates a default CreateDeploymentSchema
func DefaultCreateDeploymentSchema() schemas.CreateDeploymentSchema {
	return schemas.CreateDeploymentSchema{
		Name:                   "default-deployment",
		KubeNamespace:          "default-namespace",
		UpdateDeploymentSchema: DefaultUpdateDeploymentSchema(),
	}
}

// DefaultUpdateDeploymentSchema generates a default UpdateDeploymentSchema
func DefaultUpdateDeploymentSchema() schemas.UpdateDeploymentSchema {
	description := "default deployment"
	return schemas.UpdateDeploymentSchema{
		Targets: []*schemas.CreateDeploymentTargetSchema{
			DefaultCreateDeploymentTargetSchema(),
		},
		Description: &description,
		DoNotDeploy: false,
	}
}

// DefaultCreateDeploymentTargetSchema generates a default CreateDeploymentTargetSchema
func DefaultCreateDeploymentTargetSchema() *schemas.CreateDeploymentTargetSchema {
	return &schemas.CreateDeploymentTargetSchema{
		CompoundNim: "default-compound-nim",
		Version:     "default-version",
		Config:      DefaultDeploymentTargetConfig(),
	}
}

// DefaultDeploymentTargetConfig generates a default DeploymentTargetConfig
func DefaultDeploymentTargetConfig() *schemas.DeploymentTargetConfig {
	return &schemas.DeploymentTargetConfig{
		KubeResourceUid:     "default-uid",
		KubeResourceVersion: "v1",
		Resources:           DefaultResources(),
		HPAConf:             DefaultDeploymentTargetHPAConf(),
		DeploymentStrategy:  DefaultDeploymentStrategy(),
	}
}

// DefaultResources generates a default Resources struct
func DefaultResources() *schemas.Resources {
	return &schemas.Resources{
		Requests: &schemas.ResourceItem{
			CPU:    "500m",
			Memory: "1Gi",
		},
		Limits: &schemas.ResourceItem{
			CPU:    "1",
			Memory: "2Gi",
		},
	}
}

// DefaultDeploymentTargetHPAConf generates a default DeploymentTargetHPAConf
func DefaultDeploymentTargetHPAConf() *schemas.DeploymentTargetHPAConf {
	qps := int64(1000)
	return &schemas.DeploymentTargetHPAConf{
		CPU:         nil,
		GPU:         nil,
		Memory:      nil,
		QPS:         &qps,
		MinReplicas: int32Ptr(1),
		MaxReplicas: int32Ptr(5),
	}
}

// DefaultDeploymentStrategy generates a default DeploymentStrategy
func DefaultDeploymentStrategy() *schemas.DeploymentStrategy {
	strategy := schemas.DeploymentStrategyRollingUpdate
	return &strategy
}

// Helper function to return a pointer to an int32
func int32Ptr(i int32) *int32 {
	return &i
}
