import { Cli } from '../cli/cli';
import CloudRunnerQueryOverride from './services/cloud-runner-query-override';
import GitHub from '../github';
const core = require('@actions/core');

class CloudRunnerOptions {
  // ### ### ###
  // Input Handling
  // ### ### ###
  public static getInput(query) {
    if (GitHub.githubInputEnabled) {
      const coreInput = core.getInput(query);
      if (coreInput && coreInput !== '') {
        return coreInput;
      }
    }
    const alternativeQuery = CloudRunnerOptions.ToEnvVarFormat(query);

    // Query input sources
    if (Cli.query(query, alternativeQuery)) {
      return Cli.query(query, alternativeQuery);
    }

    if (CloudRunnerQueryOverride.query(query, alternativeQuery)) {
      return CloudRunnerQueryOverride.query(query, alternativeQuery);
    }

    if (process.env[query] !== undefined) {
      return process.env[query];
    }

    if (alternativeQuery !== query && process.env[alternativeQuery] !== undefined) {
      return process.env[alternativeQuery];
    }

    return;
  }

  public static ToEnvVarFormat(input: string) {
    if (input.toUpperCase() === input) {
      return input;
    }

    return input
      .replace(/([A-Z])/g, ' $1')
      .trim()
      .toUpperCase()
      .replace(/ /g, '_');
  }

  // ### ### ###
  // Provider parameters
  // ### ### ###

  static get region(): string {
    return CloudRunnerOptions.getInput('region') || 'eu-west-2';
  }

  // ### ### ###
  // Git syncronization parameters
  // ### ### ###

  static get githubRepo() {
    return CloudRunnerOptions.getInput('GITHUB_REPOSITORY') || CloudRunnerOptions.getInput('GITHUB_REPO') || undefined;
  }
  static get branch() {
    if (CloudRunnerOptions.getInput(`GITHUB_REF`)) {
      return CloudRunnerOptions.getInput(`GITHUB_REF`).replace('refs/', '').replace(`head/`, '').replace(`heads/`, '');
    } else if (CloudRunnerOptions.getInput('branch')) {
      return CloudRunnerOptions.getInput('branch');
    } else {
      return '';
    }
  }

  static get gitSha() {
    if (CloudRunnerOptions.getInput(`GITHUB_SHA`)) {
      return CloudRunnerOptions.getInput(`GITHUB_SHA`);
    } else if (CloudRunnerOptions.getInput(`GitSHA`)) {
      return CloudRunnerOptions.getInput(`GitSHA`);
    }
  }

  // ### ### ###
  // Cloud Runner parameters
  // ### ### ###

  static get cloudRunnerBuilderPlatform() {
    const input = CloudRunnerOptions.getInput('cloudRunnerBuilderPlatform');
    if (input) {
      return input;
    }
    if (CloudRunnerOptions.cloudRunnerCluster !== 'local') {
      return 'linux';
    }

    return;
  }

  static get cloudRunnerBranch() {
    return CloudRunnerOptions.getInput('cloudRunnerBranch') || 'cloud-runner-develop';
  }

  static get cloudRunnerCluster() {
    if (Cli.isCliMode) {
      return CloudRunnerOptions.getInput('cloudRunnerCluster') || 'aws';
    }

    return CloudRunnerOptions.getInput('cloudRunnerCluster') || 'local';
  }

  static get cloudRunnerCpu() {
    return CloudRunnerOptions.getInput('cloudRunnerCpu');
  }

  static get cloudRunnerMemory() {
    return CloudRunnerOptions.getInput('cloudRunnerMemory');
  }

  static get customJob() {
    return CloudRunnerOptions.getInput('customJob') || '';
  }

  // ### ### ###
  // Custom commands from files parameters
  // ### ### ###

  static get customStepFiles() {
    return CloudRunnerOptions.getInput('customStepFiles')?.split(`,`) || [];
  }

  static get customHookFiles() {
    return CloudRunnerOptions.getInput('customHookFiles')?.split(`,`) || [];
  }

  // ### ### ###
  // Custom commands from yaml parameters
  // ### ### ###

  static customJobHooks() {
    return CloudRunnerOptions.getInput('customJobHooks') || '';
  }

  static get postBuildSteps() {
    return CloudRunnerOptions.getInput('postBuildSteps') || '';
  }

  static get preBuildSteps() {
    return CloudRunnerOptions.getInput('preBuildSteps') || '';
  }

  // ### ### ###
  // Input override handling
  // ### ### ###

  static readInputFromOverrideList() {
    return CloudRunnerOptions.getInput('readInputFromOverrideList') || '';
  }

  static readInputOverrideCommand() {
    const value = CloudRunnerOptions.getInput('readInputOverrideCommand');

    if (value === 'gcp-secret-manager') {
      return 'gcloud secrets versions access 1 --secret="{0}"';
    } else if (value === 'aws-secret-manager') {
      return 'aws secretsmanager get-secret-value --secret-id {0}';
    }

    return value || '';
  }

  // ### ### ###
  // Aws
  // ### ### ###

  static get awsBaseStackName() {
    return CloudRunnerOptions.getInput('awsBaseStackName') || 'game-ci';
  }

  // ### ### ###
  // K8s
  // ### ### ###

  static get kubeConfig() {
    return CloudRunnerOptions.getInput('kubeConfig') || '';
  }

  static get kubeVolume() {
    return CloudRunnerOptions.getInput('kubeVolume') || '';
  }

  static get kubeVolumeSize() {
    return CloudRunnerOptions.getInput('kubeVolumeSize') || '5Gi';
  }

  static get kubeStorageClass(): string {
    return CloudRunnerOptions.getInput('kubeStorageClass') || '';
  }

  // ### ### ###
  // Caching
  // ### ### ###

  static get cacheKey(): string {
    return CloudRunnerOptions.getInput('cacheKey') || CloudRunnerOptions.branch;
  }

  // ### ### ###
  // Utility Parameters
  // ### ### ###

  static get cloudRunnerDebug(): boolean {
    return CloudRunnerOptions.getInput(`cloudRunnerTests`) || CloudRunnerOptions.getInput(`cloudRunnerDebug`) || false;
  }
  static get cloudRunnerDebugTree(): boolean {
    return CloudRunnerOptions.getInput(`cloudRunnerDebugTree`) || false;
  }
  static get cloudRunnerDebugEnv(): boolean {
    return CloudRunnerOptions.getInput(`cloudRunnerDebugEnv`) || false;
  }

  static get watchCloudRunnerToEnd(): boolean {
    const input = CloudRunnerOptions.getInput(`watchToEnd`);

    return !input || input === 'true';
  }

  public static get useSharedLargePackages(): boolean {
    return CloudRunnerOptions.getInput(`useSharedLargePackages`) || false;
  }

  public static get useLz4Compression(): boolean {
    return CloudRunnerOptions.getInput(`useLz4Compression`) || true;
  }

  // ### ### ###
  // Retained Workspace
  // ### ### ###

  public static get retainWorkspaces(): boolean {
    return CloudRunnerOptions.getInput(`retainWorkspaces`) || false;
  }

  static get maxRetainedWorkspaces(): number {
    return Number(CloudRunnerOptions.getInput(`maxRetainedWorkspaces`)) || 3;
  }
}

export default CloudRunnerOptions;
