/*
 * © 2021 Thoughtworks, Inc.
 */

import {
  COMPUTE_PROCESSOR_TYPES,
  skyLakeBroadwellHaswellAMDRome,
  skyLakeBroadwellHaswellSandyBridgeIvyBridge,
} from '@cloud-carbon-footprint/core'

export enum SHARED_CORE_PROCESSORS {
  E2_MICRO = 'e2-micro',
  E2_SMALL = 'e2-small',
  E2_MEDIUM = 'e2-medium',
  F1_MICRO = 'f1-micro',
  G1_SMALL = 'g1-small',
}

export const SHARED_CORE_PROCESSORS_BASELINE_UTILIZATION: {
  [key: string]: number
} = {
  [SHARED_CORE_PROCESSORS.E2_MICRO]: 25,
  [SHARED_CORE_PROCESSORS.E2_SMALL]: 50,
  [SHARED_CORE_PROCESSORS.E2_MEDIUM]: 100,
  [SHARED_CORE_PROCESSORS.F1_MICRO]: 20,
  [SHARED_CORE_PROCESSORS.G1_SMALL]: 50,
}

export const INSTANCE_TYPE_COMPUTE_PROCESSOR_MAPPING: {
  [instanceType: string]: string[]
} = {
  e2: skyLakeBroadwellHaswellAMDRome,
  n2: [COMPUTE_PROCESSOR_TYPES.CASCADE_LAKE],
  n2d: [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_2ND_GEN],
  t2d: [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_3RD_GEN],
  n1: skyLakeBroadwellHaswellSandyBridgeIvyBridge,
  c2: [COMPUTE_PROCESSOR_TYPES.CASCADE_LAKE],
  c2d: [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_3RD_GEN],
  a3: [COMPUTE_PROCESSOR_TYPES.EMERALD_RAPIDS],
  g2: [COMPUTE_PROCESSOR_TYPES.CASCADE_LAKE],
  c3: [COMPUTE_PROCESSOR_TYPES.SAPPHIRE_RAPIDS],
  c4: [COMPUTE_PROCESSOR_TYPES.EMERALD_RAPIDS],
  c4a: [COMPUTE_PROCESSOR_TYPES.UNKNOWN], // Google Axion – no CPU constant yet
  n4: [COMPUTE_PROCESSOR_TYPES.EMERALD_RAPIDS],
  m3: [COMPUTE_PROCESSOR_TYPES.ICELAKE],
  h3: [COMPUTE_PROCESSOR_TYPES.SAPPHIRE_RAPIDS],
  t2a: [COMPUTE_PROCESSOR_TYPES.UNKNOWN], // Ampere Altra – no CPU constant
  t2: [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_3RD_GEN], // t2d; t2a falls back here (2-char prefix)
  [SHARED_CORE_PROCESSORS.E2_MICRO]: [COMPUTE_PROCESSOR_TYPES.UNKNOWN],
  [SHARED_CORE_PROCESSORS.E2_SMALL]: [COMPUTE_PROCESSOR_TYPES.UNKNOWN],
  [SHARED_CORE_PROCESSORS.E2_MEDIUM]: [COMPUTE_PROCESSOR_TYPES.UNKNOWN],
  [SHARED_CORE_PROCESSORS.F1_MICRO]: [COMPUTE_PROCESSOR_TYPES.UNKNOWN],
  [SHARED_CORE_PROCESSORS.G1_SMALL]: [COMPUTE_PROCESSOR_TYPES.UNKNOWN],
}
export const GPU_MACHINE_TYPES: string[] = [
  COMPUTE_PROCESSOR_TYPES.NVIDIA_GB300,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_GB200,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_B200,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_H200,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_H100,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_A100,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_RTX_PRO_6000,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_L4,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_T4,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_V100,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_P100,
  COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_P4,
]

export const GCP_ACCELERATOR_TYPE_TO_GPU_PROCESSOR: {
  [acceleratorTypeId: string]: string
} = {
  'nvidia-gb300': COMPUTE_PROCESSOR_TYPES.NVIDIA_GB300,
  'nvidia-gb200': COMPUTE_PROCESSOR_TYPES.NVIDIA_GB200,
  'nvidia-b200': COMPUTE_PROCESSOR_TYPES.NVIDIA_B200,
  'nvidia-h200-141gb': COMPUTE_PROCESSOR_TYPES.NVIDIA_H200,
  'nvidia-h100-80gb': COMPUTE_PROCESSOR_TYPES.NVIDIA_H100,
  'nvidia-a100-80gb': COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_A100,
  'nvidia-tesla-a100': COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_A100,
  'nvidia-rtx-pro-6000': COMPUTE_PROCESSOR_TYPES.NVIDIA_RTX_PRO_6000,
  'nvidia-l4': COMPUTE_PROCESSOR_TYPES.NVIDIA_L4,
  'nvidia-tesla-t4': COMPUTE_PROCESSOR_TYPES.NVIDIA_T4,
  'nvidia-tesla-v100': COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_V100,
  'nvidia-tesla-p100': COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_P100,
  'nvidia-tesla-p4': COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_P4,
}

export const MACHINE_FAMILY_TO_MACHINE_TYPE_MAPPING: {
  [instanceFamily: string]: { [instanceSize: string]: number[] } // [vcpus, scope3 emissions (mt CO2e)]
} = {
  'h3-standard': {
    'h3-standard-88': [88, 56],
  },
  'c4-standard': {
    'c4-standard-2': [2, 230],
    'c4-standard-4': [4, 230],
    'c4-standard-8': [8, 230],
    'c4-standard-16': [16, 230],
    'c4-standard-24': [24, 230],
    'c4-standard-32': [32, 230],
    'c4-standard-48': [48, 230],
    'c4-standard-96': [96, 230],
    'c4-standard-144': [144, 230],
    'c4-standard-192': [192, 230],
    'c4-standard-288': [288, 230],
  },
  'c4-highcpu': {
    'c4-highcpu-2': [2, 66],
    'c4-highcpu-4': [4, 66],
    'c4-highcpu-8': [8, 66],
    'c4-highcpu-16': [16, 66],
    'c4-highcpu-24': [24, 66],
    'c4-highcpu-32': [32, 66],
    'c4-highcpu-48': [48, 66],
    'c4-highcpu-96': [96, 66],
    'c4-highcpu-144': [144, 66],
    'c4-highcpu-192': [192, 66],
    'c4-highcpu-288': [288, 66],
  },
  'c4-highmem': {
    'c4-highmem-2': [2, 1000],
    'c4-highmem-4': [4, 1000],
    'c4-highmem-8': [8, 1000],
    'c4-highmem-16': [16, 1000],
    'c4-highmem-24': [24, 1000],
    'c4-highmem-32': [32, 1000],
    'c4-highmem-48': [48, 1000],
    'c4-highmem-96': [96, 1000],
    'c4-highmem-144': [144, 1000],
    'c4-highmem-192': [192, 1000],
    'c4-highmem-288': [288, 1000],
  },
  'c4a-standard': {
    'c4a-standard-1': [1, 37],
    'c4a-standard-2': [2, 37],
    'c4a-standard-4': [4, 37],
    'c4a-standard-8': [8, 37],
    'c4a-standard-16': [16, 37],
    'c4a-standard-32': [32, 37],
    'c4a-standard-48': [48, 37],
    'c4a-standard-64': [64, 37],
    'c4a-standard-72': [72, 37],
    'c4a-standard-4-lssd': [4, 38],
    'c4a-standard-8-lssd': [8, 38],
    'c4a-standard-16-lssd': [16, 38],
    'c4a-standard-32-lssd': [32, 38],
    'c4a-standard-48-lssd': [48, 38],
    'c4a-standard-64-lssd': [64, 38],
    'c4a-standard-72-lssd': [72, 38],
  },
  'c4a-highcpu': {
    'c4a-highcpu-1': [1, 10],
    'c4a-highcpu-2': [2, 10],
    'c4a-highcpu-4': [4, 10],
    'c4a-highcpu-8': [8, 10],
    'c4a-highcpu-16': [16, 10],
    'c4a-highcpu-32': [32, 10],
    'c4a-highcpu-48': [48, 10],
    'c4a-highcpu-64': [64, 10],
    'c4a-highcpu-72': [72, 10],
  },
  'c4a-highmem': {
    'c4a-highmem-1': [1, 150],
    'c4a-highmem-2': [2, 150],
    'c4a-highmem-4': [4, 150],
    'c4a-highmem-8': [8, 150],
    'c4a-highmem-16': [16, 150],
    'c4a-highmem-32': [32, 150],
    'c4a-highmem-48': [48, 150],
    'c4a-highmem-64': [64, 150],
    'c4a-highmem-72': [72, 150],
    'c4a-highmem-4-lssd': [4, 150],
    'c4a-highmem-8-lssd': [8, 150],
    'c4a-highmem-16-lssd': [16, 150],
    'c4a-highmem-32-lssd': [32, 150],
    'c4a-highmem-48-lssd': [48, 150],
    'c4a-highmem-64-lssd': [64, 150],
    'c4a-highmem-72-lssd': [72, 150],
  },
  'c3-standard': {
    'c3-standard-4': [4, 220],
    'c3-standard-8': [8, 220],
    'c3-standard-22': [22, 220],
    'c3-standard-44': [44, 220],
    'c3-standard-88': [88, 220],
    'c3-standard-176': [176, 220],
    'c3-standard-192-metal': [192, 260],
    'c3-standard-4-lssd': [4, 220],
    'c3-standard-8-lssd': [8, 220],
    'c3-standard-22-lssd': [22, 220],
    'c3-standard-44-lssd': [44, 220],
    'c3-standard-88-lssd': [88, 220],
    'c3-standard-176-lssd': [176, 220],
  },
  'c3-highcpu': {
    'c3-highcpu-4': [4, 56],
    'c3-highcpu-8': [8, 56],
    'c3-highcpu-22': [22, 56],
    'c3-highcpu-44': [44, 56],
    'c3-highcpu-88': [88, 56],
    'c3-highcpu-176': [176, 56],
    'c3-highcpu-192-metal': [192, 120],
  },
  'c3-highmem': {
    'c3-highmem-4': [4, 900],
    'c3-highmem-8': [8, 900],
    'c3-highmem-22': [22, 900],
    'c3-highmem-44': [44, 900],
    'c3-highmem-88': [88, 900],
    'c3-highmem-176': [176, 900],
    'c3-highmem-192-metal': [192, 1000],
  },
  'c3d-standard': {
    'c3d-standard-4': [4, 900],
    'c3d-standard-8': [8, 900],
    'c3d-standard-16': [16, 900],
    'c3d-standard-30': [30, 900],
    'c3d-standard-60': [60, 900],
    'c3d-standard-90': [90, 900],
    'c3d-standard-180': [180, 900],
    'c3d-standard-360': [360, 900],
    'c3d-standard-8-lssd': [8, 900],
    'c3d-standard-16-lssd': [16, 900],
    'c3d-standard-30-lssd': [30, 900],
    'c3d-standard-60-lssd': [60, 900],
    'c3d-standard-90-lssd': [90, 900],
    'c3d-standard-180-lssd': [180, 900],
    'c3d-standard-360-lssd': [360, 900],
  },
  'c3d-highcpu': {
    'c3d-highcpu-4': [4, 220],
    'c3d-highcpu-8': [8, 220],
    'c3d-highcpu-16': [16, 220],
    'c3d-highcpu-30': [30, 220],
    'c3d-highcpu-60': [60, 220],
    'c3d-highcpu-90': [90, 220],
    'c3d-highcpu-180': [180, 220],
    'c3d-highcpu-360': [360, 220],
  },
  'c3d-highmem': {
    'c3d-highmem-4': [4, 3700],
    'c3d-highmem-8': [8, 3700],
    'c3d-highmem-16': [16, 3700],
    'c3d-highmem-30': [30, 3700],
    'c3d-highmem-60': [60, 3700],
    'c3d-highmem-90': [90, 3700],
    'c3d-highmem-180': [180, 3700],
    'c3d-highmem-360': [360, 3700],
    'c3d-highmem-8-lssd': [8, 3700],
    'c3d-highmem-16-lssd': [16, 3700],
    'c3d-highmem-30-lssd': [30, 3700],
    'c3d-highmem-60-lssd': [60, 3700],
    'c3d-highmem-90-lssd': [90, 3700],
    'c3d-highmem-180-lssd': [180, 3700],
    'c3d-highmem-360-lssd': [360, 3700],
  },
  'c2d-standard': {
    'c2d-standard-2': [2, 90],
    'c2d-standard-4': [4, 90],
    'c2d-standard-8': [8, 90],
    'c2d-standard-16': [16, 90],
    'c2d-standard-32': [32, 90],
    'c2d-standard-56': [56, 90],
    'c2d-standard-112': [112, 90],
  },
  'c2d-highcpu': {
    'c2d-highcpu-2': [2, 23],
    'c2d-highcpu-4': [4, 23],
    'c2d-highcpu-8': [8, 23],
    'c2d-highcpu-16': [16, 23],
    'c2d-highcpu-32': [32, 23],
    'c2d-highcpu-56': [56, 23],
    'c2d-highcpu-112': [112, 23],
  },
  'c2d-highmem': {
    'c2d-highmem-2': [2, 360],
    'c2d-highmem-4': [4, 360],
    'c2d-highmem-8': [8, 360],
    'c2d-highmem-16': [16, 360],
    'c2d-highmem-32': [32, 360],
    'c2d-highmem-56': [56, 360],
    'c2d-highmem-112': [112, 360],
  },
  'c2-standard': {
    'c2-standard-4': [4, 26],
    'c2-standard-8': [8, 26],
    'c2-standard-16': [16, 26],
    'c2-standard-30': [30, 26],
    'c2-standard-60': [60, 26],
  },
  'n4-standard': {
    'n4-standard-2': [2, 46],
    'n4-standard-4': [4, 46],
    'n4-standard-8': [8, 46],
    'n4-standard-16': [16, 46],
    'n4-standard-32': [32, 46],
    'n4-standard-48': [48, 46],
    'n4-standard-64': [64, 46],
    'n4-standard-80': [80, 46],
  },
  'n4-highcpu': {
    'n4-highcpu-2': [2, 12],
    'n4-highcpu-4': [4, 12],
    'n4-highcpu-8': [8, 12],
    'n4-highcpu-16': [16, 12],
    'n4-highcpu-32': [32, 12],
    'n4-highcpu-48': [48, 12],
    'n4-highcpu-64': [64, 12],
    'n4-highcpu-80': [80, 12],
  },
  'n4-highmem': {
    'n4-highmem-2': [2, 180],
    'n4-highmem-4': [4, 180],
    'n4-highmem-8': [8, 180],
    'n4-highmem-16': [16, 180],
    'n4-highmem-32': [32, 180],
    'n4-highmem-48': [48, 180],
    'n4-highmem-64': [64, 180],
    'n4-highmem-80': [80, 180],
  },
  'e2-standard': {
    'e2-standard-2': [2, 8],
    'e2-standard-4': [4, 8],
    'e2-standard-8': [8, 8],
    'e2-standard-16': [16, 8],
    'e2-standard-32': [32, 8],
  },
  'e2-highmem': {
    'e2-highmem-2': [2, 8],
    'e2-highmem-4': [4, 8],
    'e2-highmem-8': [8, 8],
    'e2-highmem-16': [16, 8],
  },
  'e2-highcpu': {
    'e2-highcpu-2': [2, 0.89],
    'e2-highcpu-4': [4, 0.89],
    'e2-highcpu-8': [8, 0.89],
    'e2-highcpu-16': [16, 0.89],
    'e2-highcpu-32': [32, 0.89],
  },
  'n2-standard': {
    'n2-standard-2': [2, 120],
    'n2-standard-4': [4, 120],
    'n2-standard-8': [8, 120],
    'n2-standard-16': [16, 120],
    'n2-standard-32': [32, 120],
    'n2-standard-48': [48, 120],
    'n2-standard-64': [64, 120],
    'n2-standard-80': [80, 120],
    'n2-standard-96': [96, 120],
    'n2-standard-128': [128, 120],
  },
  'n2-highmem': {
    'n2-highmem-2': [2, 120],
    'n2-highmem-4': [4, 120],
    'n2-highmem-8': [8, 120],
    'n2-highmem-16': [16, 120],
    'n2-highmem-32': [32, 120],
    'n2-highmem-48': [48, 120],
    'n2-highmem-64': [64, 120],
    'n2-highmem-80': [80, 120],
    'n2-highmem-96': [96, 120],
    'n2-highmem-128': [128, 120],
  },
  'n2-highcpu': {
    'n2-highcpu-2': [2, 330],
    'n2-highcpu-4': [4, 330],
    'n2-highcpu-8': [8, 330],
    'n2-highcpu-16': [16, 330],
    'n2-highcpu-32': [32, 330],
    'n2-highcpu-48': [48, 330],
    'n2-highcpu-64': [64, 330],
    'n2-highcpu-80': [80, 330],
    'n2-highcpu-96': [96, 330],
  },
  'n2d-standard': {
    'n2d-standard-2': [2, 360],
    'n2d-standard-4': [4, 360],
    'n2d-standard-8': [8, 360],
    'n2d-standard-16': [16, 360],
    'n2d-standard-32': [32, 360],
    'n2d-standard-48': [48, 360],
    'n2d-standard-64': [64, 360],
    'n2d-standard-80': [80, 360],
    'n2d-standard-96': [96, 360],
    'n2d-standard-128': [128, 360],
    'n2d-standard-224': [224, 360],
  },
  'n2d-highmem': {
    'n2d-highmem-2': [2, 23],
    'n2d-highmem-4': [4, 23],
    'n2d-highmem-8': [8, 23],
    'n2d-highmem-16': [16, 23],
    'n2d-highmem-32': [32, 23],
    'n2d-highmem-48': [48, 23],
    'n2d-highmem-64': [64, 23],
    'n2d-highmem-80': [80, 23],
    'n2d-highmem-96': [96, 23],
  },
  'n2d-highcpu': {
    'n2d-highcpu-2': [2, 260],
    'n2d-highcpu-4': [4, 260],
    'n2d-highcpu-8': [8, 260],
    'n2d-highcpu-16': [16, 260],
    'n2d-highcpu-32': [32, 260],
    'n2d-highcpu-48': [48, 260],
    'n2d-highcpu-64': [64, 260],
    'n2d-highcpu-80': [80, 260],
    'n2d-highcpu-96': [96, 260],
    'n2d-highcpu-128': [128, 260],
    'n2d-highcpu-224': [224, 260],
  },
  't2d-standard': {
    't2d-standard-1': [1, 26],
    't2d-standard-2': [2, 26],
    't2d-standard-4': [4, 26],
    't2d-standard-8': [8, 26],
    't2d-standard-16': [16, 26],
    't2d-standard-32': [32, 26],
    't2d-standard-48': [48, 26],
    't2d-standard-60': [60, 26],
  },
  't2a-standard': {
    't2a-standard-1': [1, 17],
    't2a-standard-2': [2, 17],
    't2a-standard-4': [4, 17],
    't2a-standard-8': [8, 17],
    't2a-standard-16': [16, 17],
    't2a-standard-32': [32, 17],
    't2a-standard-48': [48, 17],
  },
  'n1-standard': {
    'n1-standard-1': [1, 58],
    'n1-standard-2': [2, 58],
    'n1-standard-4': [4, 58],
    'n1-standard-8': [8, 58],
    'n1-standard-16': [16, 58],
    'n1-standard-32': [32, 58],
    'n1-standard-64': [64, 58],
    'n1-standard-96': [96, 58],
  },
  'n1-highmem': {
    'n1-highmem-2': [2, 170],
    'n1-highmem-4': [4, 170],
    'n1-highmem-8': [8, 170],
    'n1-highmem-16': [16, 170],
    'n1-highmem-32': [32, 170],
    'n1-highmem-64': [64, 170],
    'n1-highmem-96': [96, 170],
  },
  'n1-highcpu': {
    'n1-highcpu-2': [2, 4.6],
    'n1-highcpu-4': [4, 4.6],
    'n1-highcpu-8': [8, 4.6],
    'n1-highcpu-16': [16, 4.6],
    'n1-highcpu-32': [32, 4.6],
    'n1-highcpu-64': [64, 4.6],
    'n1-highcpu-96': [96, 4.6],
  },
}

export const MACHINE_FAMILY_SHARED_CORE_TO_MACHINE_TYPE_MAPPING: {
  [instanceFamily: string]: { [instanceSize: string]: number[] } // [vcpus, scope3 emissions]
} = {
  e2: {
    'e2-micro': [2, 0.4],
    'e2-small': [2, 0.4],
    'e2-medium': [2, 0.4],
    'e2-standard-32': [32, 8], // Used as a proxy for a full server in the machine family
  },
}

export const N1_SHARED_CORE_MACHINE_FAMILY_TO_MACHINE_TYPE_MAPPING: {
  [instanceSize: string]: number[] // [vcpus, scope3 emissions]
} = {
  'f1-micro': [1, 0.4],
  'g1-small': [1, 0.4],
  'n1-standard-96': [96, 58], // Used as a proxy for a full server in the machine family
}
