import { red } from 'cli-color';
import moment from 'moment';
import { Key } from '../model/keys';
import { isWindows } from './isWindows';
import { updateCreds } from './updateCreds';
import { log } from './log';

// if adding new output types be sure to update getOutputValues.ts
export function getKeyOutput(
  format: string,
  key: Key,
  profile: string | undefined,
  force: boolean | undefined
) {
  const keyExpires = moment(key.expires).format();

  log(`using output format: ${format}`);

  switch (format) {
    case 'docker': {
      return `-e AWS_ACCESS_KEY_ID=${key.accessKey} -e AWS_SECRET_ACCESS_KEY=${key.secretKey} -e AWS_SESSION_TOKEN=${key.sessionToken} -e AWS_SESSION_EXPIRES=${keyExpires}`;
    }
    case 'terraformarg': {
      return `-e ALKS_ACCESS_KEY_ID=${key.accessKey} -e ALKS_SECRET_ACCESS_KEY=${key.secretKey} -e ALKS_SESSION_TOKEN=${key.sessionToken} -e ALKS_SESSION_EXPIRES=${keyExpires}`;
    }
    case 'tarraformenv': {
      const cmd = isWindows() ? 'SET' : 'export';
      return `${cmd} ALKS_ACCESS_KEY_ID=${key.accessKey} && ${cmd} ALKS_SECRET_ACCESS_KEY=${key.secretKey} && ${cmd} ALKS_SESSION_TOKEN=${key.sessionToken} && ${cmd} ALKS_SESSION_EXPIRES=${keyExpires}`;
    }
    case 'json': {
      const keyData = {
        accessKey: key.accessKey,
        secretKey: key.secretKey,
        sessionToken: key.sessionToken,
        expires: key.expires,
        changeNumber: key.changeNumber, // This is the only format using the unformatted "key.expires". This may be a bug but I'm leaving it for the moment for backwards compatibility
      };
      return JSON.stringify(keyData, null, 4);
    }
    case 'creds': {
      if (updateCreds(key, profile, force)) {
        let msg = 'Your AWS credentials file has been updated';

        if (profile) {
          msg += ` with the named profile: ${profile}`;
        }

        return msg;
      } else {
        return red(
          `The ${profile} profile already exists in AWS credentials. Please pass -f to force overwrite.`
        );
      }
    }
    case 'idea': {
      return `AWS_ACCESS_KEY_ID=${key.accessKey}\nAWS_SECRET_ACCESS_KEY=${key.secretKey}\nAWS_SESSION_TOKEN=${key.sessionToken}\nAWS_SESSION_EXPIRES=${keyExpires}`;
    }
    case 'powershell': {
      return `$env:AWS_ACCESS_KEY_ID, $env:AWS_SECRET_ACCESS_KEY, $env:AWS_SESSION_TOKEN, $env:AWS_SESSION_EXPIRES, $env:CHANGE_NUMBER = "${
        key.accessKey
      }","${key.secretKey}","${key.sessionToken}","${keyExpires}", "${
        key.changeNumber ?? ''
      }"`;
    }
    case 'fishshell': {
      return `set -xg AWS_ACCESS_KEY_ID '${key.accessKey}'; and set -xg AWS_SECRET_ACCESS_KEY '${key.secretKey}'; and set -xg AWS_SESSION_TOKEN '${key.sessionToken}'; and set -xg AWS_SESSION_EXPIRES '${keyExpires}'; and set -xg CHANGE_NUMBER '${key.changeNumber}'`;
    }
    case 'aws': {
      return JSON.stringify({
        Version: 1,
        AccessKeyId: key.accessKey,
        SecretAccessKey: key.secretKey,
        SessionToken: key.sessionToken,
        Expiration: moment(key.expires).toISOString(),
      });
    }
    case 'linux': {
      // forces export format
      return `export AWS_ACCESS_KEY_ID=${key.accessKey} && export AWS_SECRET_ACCESS_KEY=${key.secretKey} && export AWS_SESSION_TOKEN=${key.sessionToken} && export AWS_SESSION_EXPIRES=${keyExpires} && export CHANGE_NUMBER='${key.changeNumber}'`;
    }
    case 'export': // fall through to default case
    case 'set':
    default: {
      console.error(
        'WARNING: Because this tool runs in a subshell, it cannot set environment variables in the parent shell. To use these keys, copy the commands printed below and run them in your current shell to have these environment variables set'
      );

      const cmd = isWindows() || format === 'set' ? 'SET' : 'export';

      return `${cmd} AWS_ACCESS_KEY_ID=${key.accessKey} && ${cmd} AWS_SECRET_ACCESS_KEY=${key.secretKey} && ${cmd} AWS_SESSION_TOKEN=${key.sessionToken} && ${cmd} AWS_SESSION_EXPIRES=${keyExpires} && ${cmd} CHANGE_NUMBER='${key.changeNumber}'`;
    }
  }
}
