'use strict';

const utils = require('./utils');
const colors = require('ansi-colors');
const styles = {
  default: colors.noop,
  noop: colors.noop,

  /**
   * Modifiers
   */

  complementary: utils.complement,
  opposite: utils.inverse,
  get inverse() {
    return this.opposite(this.primary);
  },
  get complement() {
    return this.complementary(this.primary);
  },

  /**
   * Main color
   */

  primary: colors.cyan,

  /**
   * Main palette
   */

  success: colors.green,
  danger: colors.magenta,
  strong: colors.bold,
  warning: colors.yellow,
  muted: colors.dim,
  disabled: colors.gray,
  dark: colors.dim.gray,
  get info() {
    return this.primary;
  },
  get heading() {
    return this.primary.underline;
  },

  /**
   * Statuses
   */

  get pending() {
    return this.primary;
  },
  get submitted() {
    return this.success;
  },
  get cancelled() {
    return this.danger;
  },

  /**
   * Special styling
   */

  get placeholder() {
    return this.primary.dim;
  },
  get highlight() {
    return this.inverse;
  }
};

styles.merge = (options = {}) => {
  if (options.styles && typeof options.styles.enabled === 'boolean') {
    colors.enabled = options.styles.enabled;
  }
  if (options.styles && typeof options.styles.visible === 'boolean') {
    colors.visible = options.styles.visible;
  }

  let result = utils.merge({}, styles, options.styles);
  delete result.merge;

  for (let key of Object.keys(colors.styles)) {
    if (!result.hasOwnProperty(key)) {
      Reflect.defineProperty(result, key, {
        get() {
          return colors[key];
        }
      });
    }
  }

  return result;
};

module.exports = styles;