import { PorImageRegistryModel } from '@/docker/models/porImageRegistry';
import { KubernetesApplicationDataAccessPolicies, KubernetesApplicationDeploymentTypes, KubernetesApplicationPublishingTypes, KubernetesApplicationPlacementTypes } from './models';

/**
 * KubernetesApplicationFormValues Model
 */
export function KubernetesApplicationFormValues() {
  this.ApplicationType = undefined; // will only exist for formValues generated from Application (app edit situation;
  this.ResourcePool = {};
  this.Name = '';
  this.StackName = '';
  this.ApplicationOwner = '';
  this.ImageModel = new PorImageRegistryModel();
  this.Note = '';
  this.MemoryLimit = 0;
  this.CpuLimit = 0;
  this.DeploymentType = KubernetesApplicationDeploymentTypes.REPLICATED;
  this.ReplicaCount = 1;
  this.AutoScaler = {};
  this.Containers = [];
  this.Services = [];
  this.EnvironmentVariables = []; // KubernetesApplicationEnvironmentVariableFormValue lis;
  this.DataAccessPolicy = KubernetesApplicationDataAccessPolicies.ISOLATED;
  this.PersistedFolders = []; // KubernetesApplicationPersistedFolderFormValue lis;
  this.Configurations = []; // KubernetesApplicationConfigurationFormValue lis;
  this.PublishingType = KubernetesApplicationPublishingTypes.CLUSTER_IP;
  this.PublishedPorts = []; // KubernetesApplicationPublishedPortFormValue lis;
  this.PlacementType = KubernetesApplicationPlacementTypes.PREFERRED;
  this.Placements = []; // KubernetesApplicationPlacementFormValue lis;
  this.OriginalIngresses = undefined;
  this.IsPublishingService = false;
}

export const KubernetesApplicationConfigurationFormValueOverridenKeyTypes = Object.freeze({
  NONE: 0,
  ENVIRONMENT: 1,
  FILESYSTEM: 2,
});

/**
 * KubernetesApplicationConfigurationFormValueOverridenKey Model
 */
const _KubernetesApplicationConfigurationFormValueOverridenKey = Object.freeze({
  Key: '',
  Path: '',
  Type: KubernetesApplicationConfigurationFormValueOverridenKeyTypes.ENVIRONMENT,
});

export class KubernetesApplicationConfigurationFormValueOverridenKey {
  constructor() {
    Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationConfigurationFormValueOverridenKey)));
  }
}

/**
 * KubernetesApplicationConfigurationFormValue Model
 */
const _KubernetesApplicationConfigurationFormValue = Object.freeze({
  SelectedConfiguration: undefined,
  Overriden: false,
  OverridenKeys: [], // KubernetesApplicationConfigurationFormValueOverridenKey list
});

export class KubernetesApplicationConfigurationFormValue {
  constructor() {
    Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationConfigurationFormValue)));
  }
}

/**
 * KubernetesApplicationEnvironmentVariableFormValue Model
 */
const _KubernetesApplicationEnvironmentVariableFormValue = Object.freeze({
  Name: '',
  Value: '',
  IsSecret: false,
  NeedsDeletion: false,
  IsNew: true,
  NameIndex: '', // keep the original name for sorting
});

export class KubernetesApplicationEnvironmentVariableFormValue {
  constructor() {
    Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationEnvironmentVariableFormValue)));
  }
}

/**
 * KubernetesApplicationPersistedFolderFormValue Model
 */
const _KubernetesApplicationPersistedFolderFormValue = Object.freeze({
  PersistentVolumeClaimName: '', // will be empty for new volumes (create/edit app) and filled for existing ones (edit)
  NeedsDeletion: false,
  ContainerPath: '',
  Size: '',
  SizeUnit: 'GB',
  StorageClass: {},
  ExistingVolume: null,
  UseNewVolume: true,
});

export class KubernetesApplicationPersistedFolderFormValue {
  constructor(storageClass) {
    Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationPersistedFolderFormValue)));
    this.StorageClass = storageClass;
  }
}

/**
 * KubernetesApplicationPublishedPortFormValue Model
 */
export function KubernetesApplicationPublishedPortFormValue() {
  return {
    NeedsDeletion: false,
    IsNew: true,
    ContainerPort: '',
    NodePort: '',
    LoadBalancerPort: '',
    LoadBalancerNodePort: undefined, // only filled to save existing loadbalancer nodePort and drop it when moving app exposure from LB to Internal/NodePort
    Protocol: 'TCP',
    IngressName: undefined,
    IngressRoute: undefined,
    IngressHost: undefined,
    IngressHosts: [],
  };
}

export function KubernetesApplicationPlacementFormValue() {
  return {
    Label: {},
    Value: '',
    NeedsDeletion: false,
    IsNew: true,
  };
}

/**
 * KubernetesApplicationAutoScalerFormValue Model
 */
const _KubernetesApplicationAutoScalerFormValue = Object.freeze({
  MinReplicas: 0,
  MaxReplicas: 0,
  TargetCPUUtilization: 50,
  ApiVersion: '',
  IsUsed: false,
});

export class KubernetesApplicationAutoScalerFormValue {
  constructor() {
    Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationAutoScalerFormValue)));
  }
}

export function KubernetesFormValidationReferences() {
  return {
    refs: {},
    hasRefs: false,
  };
}
