package models

import "gopkg.in/yaml.v3"

type ServiceResource struct {
	Action            string `yaml:"action,omitempty"`
	SuccessCondition  string `yaml:"successCondition,omitempty"`
	FailureCondition  string `yaml:"failureCondition,omitempty"`
	SetOwnerReference bool   `yaml:"setOwnerReference,omitempty"`
	Manifest          string `yaml:"manifest,omitempty"`
}

type Service struct {
	APIVersion string      `yaml:"apiVersion"`
	Kind       string      `yaml:"kind"`
	Metadata   Metadata    `yaml:"metadata"`
	Spec       ServiceSpec `yaml:"spec"`
}

func (s *Service) BindToArgo(workflow *Workflow) error {
	service_manifest, err := yaml.Marshal(s)
	if err != nil {
		return err
	}
	service_template := Template{Name: "workflow-service-pod",
		Resource: ServiceResource{
			Action:            "create",
			SuccessCondition:  "status.succeeded > 0",
			FailureCondition:  "status.failed > 3",
			SetOwnerReference: true,
			Manifest:          string(service_manifest),
		},
	}
	workflow.Spec.Templates = append(workflow.Spec.Templates, service_template)
	return nil
}

type Metadata struct {
	Name string `yaml:"name"`
}

// ServiceSpec is the specification of the Kubernetes Service
type ServiceSpec struct {
	Selector  map[string]string `yaml:"selector,omitempty"`
	Ports     []ServicePort     `yaml:"ports"`
	ClusterIP string            `yaml:"clusterIP,omitempty"`
	Type      string            `yaml:"type,omitempty"`
}

// ServicePort defines a port for a Kubernetes Service
type ServicePort struct {
	Name       string `yaml:"name"` // Even if empty need to be in the yaml
	Protocol   string `yaml:"protocol,omitempty"`
	Port       int    `yaml:"port"`
	TargetPort int    `yaml:"targetPort,omitempty"`
}