import * as JsonPatch from 'fast-json-patch';
import { KubernetesHorizontalPodAutoScaler } from './models';
import { KubernetesHorizontalPodAutoScalerCreatePayload } from './payload';

export class KubernetesHorizontalPodAutoScalerConverter {
  /**
   * Convert API data to KubernetesHorizontalPodAutoScaler model
   */
  static apiToModel(data, yaml) {
    const res = new KubernetesHorizontalPodAutoScaler();
    res.Id = data.metadata.uid;
    res.Namespace = data.metadata.namespace;
    res.Name = data.metadata.name;
    res.MinReplicas = data.spec.minReplicas;
    res.MaxReplicas = data.spec.maxReplicas;
    res.TargetCPUUtilization = data.spec.targetCPUUtilizationPercentage;

    if (data.spec.scaleTargetRef) {
      res.TargetEntity.ApiVersion = data.spec.scaleTargetRef.apiVersion;
      res.TargetEntity.Kind = data.spec.scaleTargetRef.kind;
      res.TargetEntity.Name = data.spec.scaleTargetRef.name;
    }
    res.Yaml = yaml ? yaml.data : '';
    return res;
  }

  static createPayload(data) {
    const payload = new KubernetesHorizontalPodAutoScalerCreatePayload();
    payload.metadata.namespace = data.Namespace;
    payload.metadata.name = data.TargetEntity.Name;
    payload.spec.minReplicas = data.MinReplicas;
    payload.spec.maxReplicas = data.MaxReplicas;
    payload.spec.targetCPUUtilizationPercentage = data.targetCpuUtilizationPercentage;
    payload.spec.scaleTargetRef.apiVersion = data.TargetEntity.ApiVersion;
    payload.spec.scaleTargetRef.kind = data.TargetEntity.Kind;
    payload.spec.scaleTargetRef.name = data.TargetEntity.Name;
    return payload;
  }

  static patchPayload(oldScaler, newScaler) {
    const oldPayload = KubernetesHorizontalPodAutoScalerConverter.createPayload(oldScaler);
    const newPayload = KubernetesHorizontalPodAutoScalerConverter.createPayload(newScaler);
    const payload = JsonPatch.compare(oldPayload, newPayload);
    return payload;
  }

  static applicationFormValuesToModel(formValues, kind) {
    const res = new KubernetesHorizontalPodAutoScaler();
    res.Name = formValues.Name;
    res.Namespace = formValues.ResourcePool.Namespace.Name;
    res.MinReplicas = formValues.AutoScaler.minReplicas;
    res.MaxReplicas = formValues.AutoScaler.maxReplicas;
    res.targetCpuUtilizationPercentage = formValues.AutoScaler.targetCpuUtilizationPercentage;
    res.TargetEntity.Name = formValues.Name;
    res.TargetEntity.Kind = kind;
    res.TargetEntity.ApiVersion = formValues.AutoScaler.apiVersion;
    return res;
  }
}