import CPF from 'gerador-validador-cpf';
import _ from 'lodash';

const validate = (values) => {
  const errors = {};

  //  CPF

  if (!values.get('cpf')) {
    errors.cpf = 'Obrigatório';
  } else if (!_.isNaN(values.get('cpf'))) {
    if (!CPF.validate(values.get('cpf'))) {
      errors.cpf = 'CPF inválido';
    }
  }

  //  Gender

  if (!values.get('gender')) {
    errors.gender = 'Obrigatório';
  }

  //  ZIP No

  if (!values.get('zipNo')) {
    errors.zipNo = 'Obrigatório';
  } else if (((values.get('zipNo')).replace('-', '')).length !== 8) {
    errors.zipNo = 'Seu CEP deve conter 8 dígitos';
  }

  //  Address

  if (!values.get('uf')) {
    errors.state = 'Obrigatório';
  }
  if (!values.get('localidade')) {
    errors.localidade = 'Obrigatório';
  }
  if (!values.get('logradouro')) {
    errors.logradouro = 'Obrigatório';
  }
  if (!values.get('Number')) {
    errors.Number = 'Obrigatório';
  }

  //  Telephone

  if (!values.get('telephone')) {
    errors.telephone = 'Obrigatório';
  } else if ((values.get('telephone')).replace(/\D*/g, '').length < 10) {
    errors.telephone = 'Deve ser de 8 ou 9 dígitos';
  }

  // Payment Type

  if (!values.get('payment')) {
    errors.payment = 'Obrigatório';
  }

  //  Payment

  if (!values.get('cardNumber')) {
    errors.cardNumber = 'Obrigatório';
  } else if (values.get('cardNumber').length !== 19) {
    errors.cardNumber = 'Cartão inválido';
  }
  if (!values.get('nameOnCard')) {
    errors.nameOnCard = 'Obrigatório';
  } else if (!/[a-zA-Z]/gi.test(values.get('nameOnCard'))) {
    errors.nameOnCard = 'Deve ser apenas caracteres';
  } else if (values.get('nameOnCard').length < 2) {
    errors.nameOnCard = 'Deve ter no mínimo 2 caracteres';
  }
  const cardValidity = values.get('cardValidity');
  if (!cardValidity) {
    errors.cardValidity = 'Obrigatório';
  } else if (cardValidity.length !== 5) {
    errors.cardValidity = 'Mês / ano inválido';
  } else if (parseInt(cardValidity.split('/')[0], 10) > 12) {
    errors.cardValidity = 'Mês / ano inválido';
  } else if (parseInt(values.get('cardValidity').split('/')[1], 10) < parseInt((new Date().getFullYear()).toString().slice(2, 4), 10)) {
    errors.cardValidity = 'Mês / ano inválido';
  } else if (parseInt(values.get('cardValidity').split('/')[1], 10) === parseInt((new Date().getFullYear()).toString().slice(2, 4), 10)) {
    if (parseInt(cardValidity.split('/')[0], 10) < parseInt((new Date().getMonth() + 1), 10)) {
      errors.cardValidity = 'Mês / ano inválido';
    }
  }
  if (!values.get('cvv')) {
    errors.cvv = 'Obrigatório';
  } else if (!(values.get('cvv').length >= 3 && values.get('cvv').length <= 4)) {
    errors.cvv = 'CVV inválido';
  }

  // Agree

  if (!values.get('agree')) {
    errors.agree = 'Concordo';
  }

  return errors;
};

export default validate;
