import {
  CloudConfiguration,
  LineOfBusiness,
  ModelInfo,
  Platform,
  RelatedInstanceList,
  RequestDetails,
  RequestInfo
} from "./models/requestDetails.model";
import * as _ from "lodash";

function extractModelInfoFromNodeTemplate(node: any, type: string) {
  let modelInfo: ModelInfo = <ModelInfo>{};
  if (node["customizationUuid"] !== undefined) {
    modelInfo.modelCustomizationId = node["customizationUuid"];
  }
  if (node["modelCustomizationName"] !== undefined) {
    modelInfo.modelCustomizationName = node["modelCustomizationName"];
  }
  modelInfo.modelVersionId = node["uuid"];
  modelInfo.modelName = node["name"];
  modelInfo.modelInvariantId = node["invariantUuid"];
  modelInfo.modelType = type;
  modelInfo.modelVersion = node["version"];
  return modelInfo;
}

function extractRequestInfo(userInputs: any, userId: string): RequestInfo {
  let requestInfo: RequestInfo = <RequestInfo>{};
  if (userInputs["instanceName"] !== undefined) requestInfo.instanceName = userInputs["instanceName"];
  requestInfo.productFamilyId = userInputs["productFamily"];
  requestInfo.source = "VID";
  requestInfo.suppressRollback = userInputs["rollback"] === "false";
  requestInfo.requestorId = userId;
  return requestInfo;
}

function extractPlatform(userInputs: any): Platform {
  let platform: Platform = <Platform>{};
  platform.platformName = userInputs["platformName"];
  return platform;
}

function extractLineOfBusiness(userInputs: any) {
  let lob: LineOfBusiness = <LineOfBusiness>{};
  lob.lineOfBusinessName = userInputs["lineOfBusiness"];
  return lob;
}

function extractCloudConfiguration(userInputs: any) {
  let cloudConfig: CloudConfiguration = <CloudConfiguration>{};
  cloudConfig.lcpCloudRegionId = userInputs["lcpRegion"];
  cloudConfig.tenantId = userInputs["tenantId"];
  return cloudConfig;
}

function extractModelInfoFromVfcNode(): ModelInfo {
  let modelinfo: ModelInfo = <ModelInfo>{};
  modelinfo.modelType = "networkInstanceGroup";
  return modelinfo;
}

export function createRequest(userId: string, userInputs: any, service: any, serviceInstanceId: string, networkInstanceGroups: any, vnfCustomizationName: string, vnfCustomizationId: string) {
  let request: RequestDetails = <RequestDetails>{};
  request.requestInfo = extractRequestInfo(userInputs, userId);
  request.lineOfBusiness = extractLineOfBusiness(userInputs);
  request.cloudConfiguration = extractCloudConfiguration(userInputs);
  request.platform = extractPlatform(userInputs);
  request.modelInfo = extractModelInfoFromNodeTemplate(service.vnfs[vnfCustomizationName], "vnf");
  request.requestParameters = { userParams: [], testApi: sessionStorage.getItem("msoRequestParametersTestApiValue")};
  request.relatedInstanceList = [];
  let serviceRelatedInstance: RelatedInstanceList = {
    relatedInstance: {
      instanceId: serviceInstanceId,
      modelInfo: extractModelInfoFromNodeTemplate(service.service, "service")
    }
  };
  request.relatedInstanceList.push(serviceRelatedInstance);
  _.forOwn(networkInstanceGroups, function(group) {
    let networkInstanceGroup: RelatedInstanceList = {
      relatedInstance: {
        instanceId: group["instance-group"].id,
        modelInfo: extractModelInfoFromVfcNode()
      }
    };
    request.relatedInstanceList.push(networkInstanceGroup);
  });

  return request;
}