import  { validateChars, validateHostname } from '@rancher/ember-api-store/utils/validate';

export function parseKey(str) {
  str = str || '';

  const idx = str.indexOf('/');

  if ( idx > 0 ) {
    const prefix = str.substr(0, idx);
    const key = str.substr(idx + 1);

    return {
      str,
      prefix,
      key
    }
  } else {
    return {
      str,
      prefix: null,
      key:    str,
    }
  }
}

const MIDDLE_ONLY = ['_', '.', '-'];

export function validateIdentifier(str, displayKey, intl, errors = []) {
  validateChars(str, { validChars: 'A-Za-z0-9_.-' }, displayKey, intl, errors);

  // Indentifier cannot begin with a hyphen
  let chr = str.slice(0, 1);

  if ( MIDDLE_ONLY.includes(chr) ) {
    errors.push(intl.t(`validation.k8s.identifier.startLetter`, { key: displayKey }));
  }

  // Label cannot end with a hyphen
  chr = str.slice(-1);
  if ( MIDDLE_ONLY.includes(chr) ) {
    errors.push(intl.t(`validation.k8s.identifier.endLetter`, { key: displayKey }));
  }

  // Label must be 1-63 characters
  const min = 1;
  const max = 63;

  if ( str.length < min ) {
    errors.push(intl.t(`validation.k8s.identifier.emptyKey`, {
      key: displayKey,
      min
    }));
  } else if  ( str.length > max ) {
    errors.push(intl.t(`validation.k8s.identifier}.tooLongKey`, {
      key: displayKey,
      max
    }));
  }
}

export function validatePrefix(str, displayKey, intl, errors = []) {
  const intlKey = intl.t('generic.key');
  const min = 1;
  const max = 253;

  if ( str.length < min ) {
    errors.push(intl.t(`validation.k8s.identifier.emptyPrefix`, {
      key: displayKey,
      min
    }));
  } else if  ( str.length > max ) {
    errors.push(intl.t(`validation.k8s.identifier}.tooLongPRefix`, {
      key: displayKey,
      max
    }));
  } else {
    validateHostname(str, intlKey, intl, { restricted: false }, errors);
  }
}

export function validateKey(str, intl, errors = []) {
  const parts = parseKey(str);
  const intlKey = intl.t('generic.key');

  if ( parts.prefix ) {
    validatePrefix(parts.prefix, intlKey, intl, errors);
  }

  validateIdentifier(parts.key, intlKey, intl, errors);
}

export function validateValue(str, intl, errors = []) {
  const intlKey = intl.t('generic.value');

  validateIdentifier(str, intlKey, intl, errors);
}
