import 'dart:math';

import 'package:gainer_crypto/crypto.dart';
import 'package:get/get.dart';
import 'package:rkm/service/db/db_querys.dart';

class MainControllers{
  encrypt(String senhaDigitada,String senhaUsuario) {
    // Deixa e senha digitada em maiuscula
    var senha = senhaDigitada.toUpperCase();
    // Faz a criptografia da senha inserida
    String senhaMD5 = grHashString(GRCryptoType.md5, senha);
    // Retira o tipo (1, 2 ou 3) da senha do Usuário
    int tipo = int.parse(senhaUsuario.substring(0, 1));
    // Define a possição inicial da quebra da senha
    int posicaoInicialMin   = 0;
    int posicaoInicialMax= 0;
    int posicaoFinalMin   = 0;
    int posicaoFinalMax = 0;
    // Pra cada tipo (1, 2 ou 3) define a posição inicial da quebra da senha
    if(tipo == 1){
      posicaoInicialMin   = 0;
      posicaoInicialMax = 16;
      posicaoFinalMin   = 16;
      posicaoFinalMax = 32;
    } else if(tipo == 2){
      posicaoInicialMin   = 16;
      posicaoInicialMax   = 32;
      posicaoFinalMin   = 0;
      posicaoFinalMax = 16;
    } else if(tipo == 3){
      posicaoInicialMin   = 0;
      posicaoInicialMax   = 1;
      posicaoFinalMin   = 31;
      posicaoFinalMax = 32;
    }

    String inicio = senhaMD5.substring(posicaoInicialMin, posicaoInicialMax);
    String fim = senhaMD5.substring(posicaoFinalMin, posicaoFinalMax);

    // Faz a criptografia e concatena ela com sha1 e md5
    String senhaCriptogradafa = tipo.toString() + '\$'+ grHashString(GRCryptoType.sha1, inicio + senha + fim);
    // Retorna a senha criptografada
    return senhaCriptogradafa;
  }
  validaCNS(String cns,bool editing)async{
    //valido provisório 783107557570002
    //cns valido def 187455333020009
    String response = 'CNS inválido';
    String type = cns.substring(0,1);
    if(type == '7'|| type =='8' || type == '9'){
      response = await validaCNSProv(cns,editing);
    }else{
      response = validaCNSDef(cns,editing);
    }
    return response;
  }
  validaCNSProv(String vlrCNS,bool editing)async{
    int resto;
    int soma;
    if(vlrCNS.length == 15){
      // print('pis');
      // print(vlrCNS);
      soma = ((int.parse(vlrCNS.substring( 0, 1))) * 15)
          + ((int.parse(vlrCNS.substring( 1, 2))) * 14)
          + ((int.parse(vlrCNS.substring( 2, 3))) * 13)
          + ((int.parse(vlrCNS.substring( 3, 4))) * 12)
          + ((int.parse(vlrCNS.substring( 4, 5))) * 11)
          + ((int.parse(vlrCNS.substring( 5, 6))) * 10)
          + ((int.parse(vlrCNS.substring( 6, 7))) * 9)
          + ((int.parse(vlrCNS.substring( 7, 8))) * 8)
          + ((int.parse(vlrCNS.substring( 8, 9))) * 7)
          + ((int.parse(vlrCNS.substring( 9,10))) * 6)
          + ((int.parse(vlrCNS.substring(10,11))) * 5)
          + ((int.parse(vlrCNS.substring(11,12))) * 4)
          + ((int.parse(vlrCNS.substring(12,13))) * 3)
          + ((int.parse(vlrCNS.substring(13,14))) * 2)
          + ((int.parse(vlrCNS.substring(14,15))) * 1);

      resto = soma % 11;
      // print('soma');
      // print(soma);
      // print('resto');
      // print(resto);
      if (resto == 0)
      {
        // CNS provisório válido
        List result = editing?[]:await DBQuerys().duplicidadeCNS(vlrCNS);
        if(result.length==0){
          return 'ok';
        }else{
          return 'CNS duplicado';
        }
      }
      else
      {
        // CNS provisório inválido
        return 'CNS provisório inválido';
      }
    }else{
      if(vlrCNS.length< 15){
        return 'CNS inválido! Faltando números';
      }else{
        return 'CNS inválido! Sobrando números';
      }
    }
  }
  validaCNSDef(String vlrCNS,bool editing){
    int soma = 0;
    int resto = 0;
    int dv = 0;
    String pis = '';
    String resultado = '';

    if(vlrCNS.length == 15){
      pis = vlrCNS.substring(0,11);
      soma = (int.parse(pis.substring(0,1)) * 15) +
          ((int.parse(pis.substring(1,2))) * 14) +
          ((int.parse(pis.substring(2,3))) * 13) +
          ((int.parse(pis.substring(3,4))) * 12) +
          ((int.parse(pis.substring(4,5))) * 11) +
          ((int.parse(pis.substring(5,6))) * 10) +
          ((int.parse(pis.substring(6,7))) * 9) +
          ((int.parse(pis.substring(7,8))) * 8) +
          ((int.parse(pis.substring(8,9))) * 7) +
          ((int.parse(pis.substring(9,10))) * 6) +
          ((int.parse(pis.substring(10,11))) * 5);
      resto = soma % 11;
      dv = 11 - resto;
      if (dv == 11) {
        dv = 0;
      }
      if (dv == 10) {
        soma = (((int.parse(pis.substring(0,1))) * 15) +
            ((int.parse(pis.substring(1,2))) * 14) +
            ((int.parse(pis.substring(2,3))) * 13) +
            ((int.parse(pis.substring(3,4))) * 12) +
            ((int.parse(pis.substring(4,5))) * 11) +
            ((int.parse(pis.substring(5,6))) * 10) +
            ((int.parse(pis.substring(6,7))) * 9) +
            ((int.parse(pis.substring(7,8))) * 8) +
            ((int.parse(pis.substring(8,9))) * 7) +
            ((int.parse(pis.substring(9,10))) * 6) +
            ((int.parse(pis.substring(10,11))) * 5) + 2);
        resto = soma % 11;
        dv = 11 - resto;
        resultado = pis + "001" + dv.toString();
      } else {
        resultado = pis + "000" + dv.toString();
      }
      if (vlrCNS != resultado) {
        // CNS inválido
        return 'CNS definitivo inválido';
      } else {
        // CNS válido
        String result = editing?[]: DBQuerys().duplicidadeCNS(vlrCNS);
        if(result==''){
          return 'ok';
        }else{
          return 'CNS duplicado"';
        }
      }
    }else{
      if(vlrCNS.length< 15){
        return 'CNS inválido! Faltando números';
      }else{
        return 'CNS inválido! Sobrando números';
      }
    }
  }
  validaCPF(String cpf,bool editing)async{
    // 60352523620 CPF VÁLIDO
    if(GetUtils.isCpf(cpf)){
      if(editing){
        return 'ok';
      }else{
        List result = await DBQuerys().duplicidadeCPF(cpf);
        // print(cpf);
        if(result.length==0){
          return 'ok';
        }else{
          return 'CPF duplicado';
        }
      }
    }else{
      return 'CPF inválido';
    }
  }
  gerarCDUsuarioSus(){
    String mkTime = ((DateTime.now().millisecond)).toString();
    String seqID = ((Random().nextInt(10)*100).floor() + ((Random().nextInt(10) * 5).floor() + 1)).toString() + '00000';
    String cdUsuarioSUS = (grHashString(GRCryptoType.md5, mkTime) + seqID).toUpperCase();
    var codSize = cdUsuarioSUS.length;
    cdUsuarioSUS = cdUsuarioSUS.substring(0,32);
    'cod sus recuperado api';
    // 571A22D79C24526537C7E4CE8C0D4046
    'cod gerado para teste';
    // CA8155F4D27F205953F9D3D7974BDD70
    // 571A22D79C24526537C7E4CE8C0D4046
    // C73F93513A57571D2C7B6384A34AD22F

    return cdUsuarioSUS;
  }
  replaceDefaul(String text){
    String newText = text.toUpperCase()
        .replaceAll('Ã', 'A')
        .replaceAll('Á', 'A')
        .replaceAll('À', 'A')
        .replaceAll('Â', 'A')
        .replaceAll('Ç', 'C')
        .replaceAll('È', 'E')
        .replaceAll('É', 'E')
        .replaceAll('Ê', 'E')
        .replaceAll('Í', 'I')
        .replaceAll('Ô', 'O')
        .replaceAll('Õ', 'O')
        .replaceAll('Ó', 'O')
        .replaceAll('Ú', 'U')
        .replaceAll('Û', 'U')
    ;
    return newText;
  }
}