import {
  ordinoPartnerServiceAxios,
  ordinoProjectServiceAxios,
  ordinoTeamServiceAxios,
  ordinoUserServiceAxios,
  ordinoSystemApiKeyServiceAxios,
  ordinoUserApiKeyServiceAxios,
  ordinoServiceAxios,
  stagingOrdinoServiceAxios,
  stagingOrdinoPartnerServiceAxios,
  stagingOrdinoProjectServiceAxios,
  stagingOrdinoTeamServiceAxios,
  stagingOrdinoUserServiceAxios,
  stagingOrdinoSystemApiKeyServiceAxios,
  stagingOrdinoUserApiKeyServiceAxios,
  localOrdinoSystemApiKeyServiceAxios,
  localOrdinoProjectServiceAxios,
} from "./axios.config";

export type Environment = "staging" | "production" | "local";

export class ServiceFactory {
  private static instance: ServiceFactory;
  private currentEnvironment: Environment = "production";

  private constructor() {}

  public static getInstance(): ServiceFactory {
    if (!ServiceFactory.instance) {
      ServiceFactory.instance = new ServiceFactory();
    }
    return ServiceFactory.instance;
  }

  public setEnvironment(env: Environment): void {
    this.currentEnvironment = env;
    console.log(`Environment set to: ${env}`);
  }

  public getEnvironment(): Environment {
    return this.currentEnvironment;
  }

  public getServiceAxios() {
    return this.currentEnvironment === "staging"
      ? stagingOrdinoServiceAxios
      : ordinoServiceAxios;
  }

  public getPartnerServiceAxios() {
    return this.currentEnvironment === "staging"
      ? stagingOrdinoPartnerServiceAxios
      : ordinoPartnerServiceAxios;
  }

  public getProjectServiceAxios() {
    switch(this.currentEnvironment){
      case "local":
        return localOrdinoProjectServiceAxios;
      case "staging":
        return stagingOrdinoProjectServiceAxios;
      default:
        return ordinoProjectServiceAxios;
    }
  }

  public getTeamServiceAxios() {
    return this.currentEnvironment === "staging"
      ? stagingOrdinoTeamServiceAxios
      : ordinoTeamServiceAxios;
  }

  public getUserServiceAxios() {
    return this.currentEnvironment === "staging"
      ? stagingOrdinoUserServiceAxios
      : ordinoUserServiceAxios;
  }

  public getSystemApiKeyServiceAxios() {
    switch(this.currentEnvironment){
      case "local":
        return localOrdinoSystemApiKeyServiceAxios;
      case "staging":
        return stagingOrdinoSystemApiKeyServiceAxios;
      default:
        return ordinoSystemApiKeyServiceAxios;
    }
  }

  public getUserApiKeyServiceAxios() {
    return this.currentEnvironment === "staging"
      ? stagingOrdinoUserApiKeyServiceAxios
      : ordinoUserApiKeyServiceAxios;
  }
}

export const serviceFactory = ServiceFactory.getInstance();
