import { CompanyCtorParams } from "../Company";

import { CompanyName, FactionName, JobName } from "@enums";
import {
  softwareJobs,
  businessJobs,
  securityJobs,
  softwareConsultJobs,
  netEngJobs,
  itJobs,
  agentJobs,
  businessConsultJobs,
} from "./JobTracks";

export function getCompaniesMetadata(): Record<CompanyName, CompanyCtorParams> {
  const allTechJobs: JobName[] = [...softwareJobs, ...itJobs, ...netEngJobs, JobName.securityEng];
  const softwareJobsToHeadOfEng: JobName[] = softwareJobs.slice(0, 6);
  const softwareJobsToLeadDev: JobName[] = softwareJobs.slice(0, 4);
  const businessJobToOpsManager: JobName[] = businessJobs.slice(0, 4);

  return {
    [CompanyName.ECorp]: {
      name: CompanyName.ECorp,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 3,
      salaryMultiplier: 3,
      jobStatReqOffset: 249,
      relatedFaction: FactionName.ECorp,
    },
    [CompanyName.MegaCorp]: {
      name: CompanyName.MegaCorp,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 3,
      salaryMultiplier: 3,
      jobStatReqOffset: 249,
      relatedFaction: FactionName.MegaCorp,
    },
    [CompanyName.BachmanAndAssociates]: {
      name: CompanyName.BachmanAndAssociates,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 2.6,
      salaryMultiplier: 2.6,
      jobStatReqOffset: 224,
      relatedFaction: FactionName.BachmanAndAssociates,
    },
    [CompanyName.BladeIndustries]: {
      name: CompanyName.BladeIndustries,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 2.75,
      salaryMultiplier: 2.75,
      jobStatReqOffset: 224,
      relatedFaction: FactionName.BladeIndustries,
    },
    [CompanyName.NWO]: {
      name: CompanyName.NWO,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 2.75,
      salaryMultiplier: 2.75,
      jobStatReqOffset: 249,
      relatedFaction: FactionName.NWO,
    },
    [CompanyName.ClarkeIncorporated]: {
      name: CompanyName.ClarkeIncorporated,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 2.25,
      salaryMultiplier: 2.25,
      jobStatReqOffset: 224,
      relatedFaction: FactionName.ClarkeIncorporated,
    },
    [CompanyName.OmniTekIncorporated]: {
      name: CompanyName.OmniTekIncorporated,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 2.25,
      salaryMultiplier: 2.25,
      jobStatReqOffset: 224,
      relatedFaction: FactionName.OmniTekIncorporated,
    },
    [CompanyName.FourSigma]: {
      name: CompanyName.FourSigma,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 2.5,
      salaryMultiplier: 2.5,
      jobStatReqOffset: 224,
      relatedFaction: FactionName.FourSigma,
    },
    [CompanyName.KuaiGongInternational]: {
      name: CompanyName.KuaiGongInternational,
      companyPositions: [...allTechJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 2.2,
      salaryMultiplier: 2.2,
      jobStatReqOffset: 224,
      relatedFaction: FactionName.KuaiGongInternational,
    },
    [CompanyName.FulcrumTechnologies]: {
      name: CompanyName.FulcrumTechnologies,
      companyPositions: [...allTechJobs, ...businessJobs],
      expMultiplier: 2,
      salaryMultiplier: 2,
      jobStatReqOffset: 224,
      relatedFaction: FactionName.FulcrumSecretTechnologies,
    },
    [CompanyName.StormTechnologies]: {
      name: CompanyName.StormTechnologies,
      companyPositions: [...allTechJobs, ...softwareConsultJobs, ...businessJobs],
      expMultiplier: 1.8,
      salaryMultiplier: 1.8,
      jobStatReqOffset: 199,
    },
    [CompanyName.DefComm]: {
      name: CompanyName.DefComm,
      companyPositions: [JobName.business5, ...allTechJobs, ...softwareConsultJobs, ...businessConsultJobs],
      expMultiplier: 1.75,
      salaryMultiplier: 1.75,
      jobStatReqOffset: 199,
    },
    [CompanyName.HeliosLabs]: {
      name: CompanyName.HeliosLabs,
      companyPositions: [JobName.business5, ...allTechJobs, ...softwareConsultJobs, ...businessConsultJobs],
      expMultiplier: 1.8,
      salaryMultiplier: 1.8,
      jobStatReqOffset: 199,
    },
    [CompanyName.VitaLife]: {
      name: CompanyName.VitaLife,
      companyPositions: [...allTechJobs, ...businessJobs, ...softwareConsultJobs],
      expMultiplier: 1.8,
      salaryMultiplier: 1.8,
      jobStatReqOffset: 199,
    },
    [CompanyName.IcarusMicrosystems]: {
      name: CompanyName.IcarusMicrosystems,
      companyPositions: [...allTechJobs, ...businessJobs, ...softwareConsultJobs],
      expMultiplier: 1.9,
      salaryMultiplier: 1.9,
      jobStatReqOffset: 199,
    },
    [CompanyName.UniversalEnergy]: {
      name: CompanyName.UniversalEnergy,
      companyPositions: [...allTechJobs, ...businessJobs, ...softwareConsultJobs],
      expMultiplier: 2,
      salaryMultiplier: 2,
      jobStatReqOffset: 199,
    },
    [CompanyName.GalacticCybersystems]: {
      name: CompanyName.GalacticCybersystems,
      companyPositions: [...allTechJobs, ...businessJobs, ...softwareConsultJobs],
      expMultiplier: 1.9,
      salaryMultiplier: 1.9,
      jobStatReqOffset: 199,
    },
    [CompanyName.AeroCorp]: {
      name: CompanyName.AeroCorp,
      companyPositions: [JobName.business3, JobName.business5, ...allTechJobs, ...securityJobs, ...businessConsultJobs],
      expMultiplier: 1.7,
      salaryMultiplier: 1.7,
      jobStatReqOffset: 199,
    },
    [CompanyName.OmniaCybersystems]: {
      name: CompanyName.OmniaCybersystems,
      companyPositions: [JobName.business3, JobName.business5, ...allTechJobs, ...securityJobs, ...businessConsultJobs],
      expMultiplier: 1.7,
      salaryMultiplier: 1.7,
      jobStatReqOffset: 199,
    },
    [CompanyName.SolarisSpaceSystems]: {
      name: CompanyName.SolarisSpaceSystems,
      companyPositions: [JobName.business3, JobName.business5, ...allTechJobs, ...securityJobs, ...businessConsultJobs],
      expMultiplier: 1.7,
      salaryMultiplier: 1.7,
      jobStatReqOffset: 199,
    },
    [CompanyName.DeltaOne]: {
      name: CompanyName.DeltaOne,
      companyPositions: [JobName.business3, JobName.business5, ...allTechJobs, ...securityJobs, ...businessConsultJobs],
      expMultiplier: 1.6,
      salaryMultiplier: 1.6,
      jobStatReqOffset: 199,
    },
    [CompanyName.GlobalPharmaceuticals]: {
      name: CompanyName.GlobalPharmaceuticals,
      companyPositions: [...allTechJobs, ...businessJobs, ...softwareConsultJobs, ...securityJobs],
      expMultiplier: 1.8,
      salaryMultiplier: 1.8,
      jobStatReqOffset: 224,
    },
    [CompanyName.NovaMedical]: {
      name: CompanyName.NovaMedical,
      companyPositions: [...allTechJobs, ...businessJobs, ...softwareConsultJobs, ...securityJobs],
      expMultiplier: 1.75,
      salaryMultiplier: 1.75,
      jobStatReqOffset: 199,
    },
    [CompanyName.CIA]: {
      name: CompanyName.CIA,
      companyPositions: [
        ...softwareJobsToHeadOfEng,
        ...netEngJobs,
        JobName.securityEng,
        ...itJobs,
        ...securityJobs,
        ...agentJobs,
      ],
      expMultiplier: 2,
      salaryMultiplier: 2,
      jobStatReqOffset: 149,
    },
    [CompanyName.NSA]: {
      name: CompanyName.NSA,
      companyPositions: [
        ...softwareJobsToHeadOfEng,
        ...netEngJobs,
        JobName.securityEng,
        ...itJobs,
        ...securityJobs,
        ...agentJobs,
      ],
      expMultiplier: 2,
      salaryMultiplier: 2,
      jobStatReqOffset: 149,
    },
    [CompanyName.WatchdogSecurity]: {
      name: CompanyName.WatchdogSecurity,
      companyPositions: [
        ...softwareJobsToHeadOfEng,
        ...netEngJobs,
        ...itJobs,
        ...securityJobs,
        ...agentJobs,
        ...softwareConsultJobs,
      ],
      expMultiplier: 1.5,
      salaryMultiplier: 1.5,
      jobStatReqOffset: 124,
    },
    [CompanyName.LexoCorp]: {
      name: CompanyName.LexoCorp,
      companyPositions: [...allTechJobs, ...softwareConsultJobs, ...businessJobs, ...securityJobs],
      expMultiplier: 1.4,
      salaryMultiplier: 1.4,
      jobStatReqOffset: 99,
    },
    [CompanyName.RhoConstruction]: {
      name: CompanyName.RhoConstruction,
      companyPositions: [...softwareJobsToLeadDev, ...businessJobToOpsManager],
      expMultiplier: 1.3,
      salaryMultiplier: 1.3,
      jobStatReqOffset: 49,
    },
    [CompanyName.AlphaEnterprises]: {
      name: CompanyName.AlphaEnterprises,
      companyPositions: [...softwareJobsToLeadDev, ...businessJobToOpsManager, ...softwareConsultJobs],
      expMultiplier: 1.5,
      salaryMultiplier: 1.5,
      jobStatReqOffset: 99,
    },
    [CompanyName.Police]: {
      name: CompanyName.Police,
      companyPositions: [...securityJobs, ...softwareJobsToLeadDev],
      expMultiplier: 1.3,
      salaryMultiplier: 1.3,
      jobStatReqOffset: 99,
    },
    [CompanyName.SysCoreSecurities]: {
      name: CompanyName.SysCoreSecurities,
      companyPositions: [...allTechJobs],
      expMultiplier: 1.3,
      salaryMultiplier: 1.3,
      jobStatReqOffset: 124,
    },
    [CompanyName.CompuTek]: {
      name: CompanyName.CompuTek,
      companyPositions: [...allTechJobs],
      expMultiplier: 1.2,
      salaryMultiplier: 1.2,
      jobStatReqOffset: 74,
    },
    [CompanyName.NetLinkTechnologies]: {
      name: CompanyName.NetLinkTechnologies,
      companyPositions: [...allTechJobs],
      expMultiplier: 1.2,
      salaryMultiplier: 1.2,
      jobStatReqOffset: 99,
    },
    [CompanyName.CarmichaelSecurity]: {
      name: CompanyName.CarmichaelSecurity,
      companyPositions: [...allTechJobs, ...softwareConsultJobs, ...agentJobs, ...securityJobs],
      expMultiplier: 1.2,
      salaryMultiplier: 1.2,
      jobStatReqOffset: 74,
    },
    [CompanyName.FoodNStuff]: {
      name: CompanyName.FoodNStuff,
      companyPositions: [JobName.employee, JobName.employeePT],
      expMultiplier: 1,
      salaryMultiplier: 1,
      jobStatReqOffset: 0,
    },
    [CompanyName.JoesGuns]: {
      name: CompanyName.JoesGuns,
      companyPositions: [JobName.employee, JobName.employeePT],
      expMultiplier: 1,
      salaryMultiplier: 1,
      jobStatReqOffset: 0,
    },
    [CompanyName.OmegaSoftware]: {
      name: CompanyName.OmegaSoftware,
      companyPositions: [...softwareJobs, ...softwareConsultJobs, ...itJobs],
      expMultiplier: 1.1,
      salaryMultiplier: 1.1,
      jobStatReqOffset: 49,
    },
    [CompanyName.NoodleBar]: {
      name: CompanyName.NoodleBar,
      companyPositions: [JobName.waiter, JobName.waiterPT],
      expMultiplier: 1,
      salaryMultiplier: 1,
      jobStatReqOffset: 0,
    },
  };
}
