import React, { useState, useEffect } from 'react';
import InputMask from "react-input-mask";

function PatientForm({ onSave, onCancel, PatientDict }) {

  const FormatTelefones = (valor) => {
    const digits = String(valor).replace(/\D/g, '').slice(0, 11);
    return digits
      .replace(/(\d)/, '($1')
      .replace(/(\d{2})(\d)/, '$1) $2' )
      .replace(/(\d)(\d{4})/, '$1 $2')
      .replace(/(\d{4})(\d{4})/, '$1-$2')
  }

  const FormatCPF = (valor) => {
    const digits = String(valor).replace(/\D/g, '').slice(0, 11);
    return digits
      .replace(/(\d{3})(\d)/, '$1.$2')
      .replace(/(\d{3})(\d)/, '$1.$2')
      .replace(/(\d{3})(\d{1,2})$/, '$1-$2');
  }

  const [formData, setFormData] = useState({
    foto: null,
    nome: PatientDict.nome,
    nomeSocial: PatientDict.nome_social,
    dataNascimento: PatientDict.data_nascimento,
    genero: PatientDict.sexo,
    cpf: PatientDict.cpf,
    profissao: PatientDict.profissao ,
    nomeMae: PatientDict.nome_mae,
    profissaoMae: PatientDict.profissao_mae,
    nomePai: PatientDict.nome_pai,
    profissaoPai: PatientDict.profissao_pai,
    nomeResponsavel: '',
    cpfResponsavel: '',
    nomeConjuge: '',
    outroId: '',
    cep: '',
    cidade: PatientDict.cidade,
    estado: PatientDict.estado,
    bairro: PatientDict.bairro,
    rua: PatientDict.logradouro,
    numero: '',
    complemento: '',
    email: PatientDict.email,
    telefone1: PatientDict.celular,
    telefone2: '',
    telefone3: '',
    observacoes: '',
    rg: '',
    documentoTipo: '',
    numeroDocumento: '',
    etniaRaca: '',
    naturalidade: '',
    nacionalidade: '',
    estadoCivil: '',
    rnConvenio: false,
    
    // INFORMAÇÕES MÉDICAS
    tipoSanguineo: '',
    peso: '',
    altura: '',
    imc: '',
    alergias: '',

    // INFORMAÇÕES DE CONVÊNIO
    convenio: '',
    plano: '',
    numeroMatricula: '',
    validadeCarteira: '',
    validadeIndeterminada: false,
    pacienteVip: false, 

    // ANEXO
    anexos: null,
  });

  // Estado para armazenar a URL da foto do avatar
  const [avatarUrl, setAvatarUrl] = useState(null);

  // Estado para controlar quais seções estão colapsadas
  const [collapsedSections, setCollapsedSections] = useState({
    dadosPessoais: true, // Alterado para true para a seção ficar aberta por padrão
    infoMedicas: false,
    infoConvenio: false,
    endereco: false,
    contato: false,
    infoAdicionais: false,
    anexos: false,
  });

  // Função para alternar o estado de colapso de uma seção
  const handleToggleCollapse = (section) => {
    setCollapsedSections(prevState => ({
      ...prevState,
      [section]: !prevState[section]
    }));
  };

  // Lógica para calcular o IMC
  useEffect(() => {
    const peso = parseFloat(formData.peso);
    const altura = parseFloat(formData.altura);
    if (peso > 0 && altura > 0) {
      const imcCalculado = peso / (altura * altura);
      setFormData(prev => ({ ...prev, imc: imcCalculado.toFixed(2) }));
    } else {
      setFormData(prev => ({ ...prev, imc: '' }));
    }
  }, [formData.peso, formData.altura]);


  const handleChange = (e) => {
    const { name, value, type, checked, files } = e.target;
    
    if (type === 'checkbox') {
      setFormData({ ...formData, [name]: checked });
    } else if (type === 'file') {
      setFormData({ ...formData, [name]: files[0] });

      // Lógica para pré-visualizar a imagem no avatar
      if (name === 'foto' && files[0]) {
        const reader = new FileReader();
        reader.onloadend = () => {
          setAvatarUrl(reader.result);
        };
        reader.readAsDataURL(files[0]);
      } else if (name === 'foto' && !files[0]) {
        setAvatarUrl(null); // Limpa o avatar se nenhum arquivo for selecionado
      }

    } else {
      setFormData({ ...formData, [name]: value });
    }

    if (name.includes('cpf')) {
      let cpfFormatado = FormatCPF(value);
      setFormData(prev => ({ ...prev, [name]: cpfFormatado }));
    } else if (name.includes('telefone')) {
      let telefoneFormatado = FormatTelefones(value);
      setFormData(prev => ({ ...prev, [name]: telefoneFormatado }));
    }
  };
 
  const handleCepBlur = async () => {
    const cep = formData.cep.replace(/\D/g, '');
    if (cep.length === 8) {
      try {
        const response = await fetch(`https://viacep.com.br/ws/${cep}/json/`);
        const data = await response.json();
        if (!data.erro) {
          setFormData((prev) => ({
            ...prev,
            rua: data.logradouro || '',
            bairro: data.bairro || '',
            cidade: data.localidade || '',
            estado: data.uf || ''
          }));
        } else {
          alert('CEP não encontrado!');
        }
      } catch (error) {
        alert('Erro ao buscar o CEP.');
      }
    }
  };

  const handleSubmit = () => {
    if (!formData.nome || !formData.cpf || !formData.genero || !formData.dataNascimento){
      alert('Por favor, preencha Nome ,CPF, Gênero e data de nascimento.');
      return;
    }

    onSave({
      ...formData,
      endereco: {
        cep: formData.cep,
        cidade: formData.cidade,
        estado: formData.estado,
        bairro: formData.bairro,
        logradouro: formData.rua,
        numero: formData.numero,
        complemento: formData.complemento,
      },
      contato: {
        email: formData.email,
        telefone1: formData.telefone1,
        telefone2: formData.telefone2,
        telefone3: formData.telefone3,
      },
      infoMedicas: {
        tipoSanguineo: formData.tipoSanguineo,
        peso: formData.peso,
        altura: formData.altura,
        imc: formData.imc,
        alergias: formData.alergias,
      },
      infoConvenio: {
        convenio: formData.convenio,
        plano: formData.plano,
        numeroMatricula: formData.numeroMatricula,
        validadeCarteira: formData.validadeCarteira,
        validadeIndeterminada: formData.validadeIndeterminada,
        pacienteVip: formData.pacienteVip, 
      },
    });
  };

  return (
    <div className="card p-3">
      <h3 className="mb-3 text-center">MedicoConnect</h3>

      {/* DADOS PESSOAIS */}
      <div className="mb-5"> 
        <h5 className="fs-4 mb-0 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('dadosPessoais')}>
          Dados Pessoais
          <span className="fs-5">
            {collapsedSections.dadosPessoais ? '▲' : '▼'}
          </span>
        </h5>
        <div className={`collapse${collapsedSections.dadosPessoais ? ' show' : ''}`}>
          <div className="row mt-3">
            {/* AVATAR E INPUT DE FOTO */}
            <div className="col-md-6 mb-3 d-flex align-items-center">
              <div className="me-3">
                {avatarUrl ? (
                  <img 
                    src={avatarUrl} 
                    alt="Avatar do Paciente" 
                    style={{ width: '80px', height: '80px', borderRadius: '50%', objectFit: 'cover' }} 
                  />
                ) : (
                  <div 
                    style={{ 
                      width: '80px', 
                      height: '80px', 
                      borderRadius: '50%', 
                      backgroundColor: '#e0e0e0', 
                      display: 'flex', 
                      alignItems: 'center', 
                      justifyContent: 'center',
                      fontSize: '3rem',
                      color: '#9e9e9e'
                    }}
                  >
                    &#x2624; 
                  </div>
                )}
              </div>
              <div>
                <label htmlFor="foto-input" className="btn btn-primary">Carregar Foto</label>
                <input 
                  type="file" 
                  className="form-control d-none" 
                  name="foto" 
                  id="foto-input" 
                  onChange={handleChange} 
                  accept="image/*"
                />
                {formData.foto && <span className="ms-2">{formData.foto.name}</span>}
              </div>
            </div>
            {/* CADASTRO */}
            <div className="col-md-6 mb-3">
              <label>Nome: *</label>
              <input type="text" className="form-control" name="nome" value={formData.nome} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Nome social:</label>
              <input type="text" className="form-control" name="nomeSocial" value={formData.nomeSocial} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Data de nascimento: *</label>
              <input type="date" className="form-control" name="dataNascimento" value={formData.dataNascimento} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Gênero: *</label>
              <select className="form-control" name="genero" value={formData.genero} onChange={handleChange}>
                <option value="">Selecione</option>
                <option value="Masculino">Masculino</option>
                <option value="Feminino">Feminino</option>
                <option value="Outro">Outro</option>
              </select>
            </div>
            <div className="col-md-6 mb-3">
              <label>CPF: *</label>
              <input type="text" className="form-control" name="cpf" value={formData.cpf} onChange={ handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>RG:</label>
              <input type="text" className="form-control" name="rg" value={formData.rg} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Outros documentos:</label>
              <select className="form-control" name="documentoTipo" value={formData.documentoTipo} onChange={handleChange}>
                <option value="">Selecione</option>
                <option value="CNH">CNH</option>
                <option value="Passaporte">Passaporte</option>
              </select>
            </div>
            <div className="col-md-6 mb-3">
              <label>Número do documento:</label>
              <input type="text" className="form-control" name="numeroDocumento" value={formData.numeroDocumento} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Etnia e Raça:</label>
              <select className="form-control" name="etniaRaca" value={formData.etniaRaca} onChange={handleChange}>
                <option value="">Selecione</option>
                <option value="Branca">Branca</option>
                <option value="Preta">Preta</option>
                <option value="Parda">Parda</option>
                <option value="Amarela">Amarela</option>
                <option value="Indígena">Indígena</option>
              </select>
            </div>
            <div className="col-md-6 mb-3">
              <label>Naturalidade:</label>
              <input type="text" className="form-control" name="naturalidade" value={formData.naturalidade} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Nacionalidade:</label>
              <input type="text" className="form-control" name="nacionalidade" value={formData.nacionalidade} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Profissão:</label>
              <input type="text" className="form-control" name="profissao" value={formData.profissao} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Estado civil:</label>
              <select className="form-control" name="estadoCivil" value={formData.estadoCivil} onChange={handleChange}>
                <option value="">Selecione</option>
                <option value="Solteiro">Solteiro(a)</option>
                <option value="Casado">Casado(a)</option>
                <option value="Divorciado">Divorciado(a)</option>
                <option value="Viuvo">Viúvo(a)</option>
              </select>
            </div>
            <div className="col-md-6 mb-3">
              <label>Nome da Mãe:</label>
              <input type="text" className="form-control" name="nomeMae" value={formData.nomeMae} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Profissão da mãe:</label>
              <input type="text" className="form-control" name="profissaoMae" value={formData.profissaoMae} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Nome do Pai:</label>
              <input type="text" className="form-control" name="nomePai" value={formData.nomePai} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Profissão do pai:</label>
              <input type="text" className="form-control" name="profissaoPai" value={formData.profissaoPai} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Nome do responsável:</label>
              <input type="text" className="form-control" name="nomeResponsavel" value={formData.nomeResponsavel} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>CPF do responsável:</label>
              <input type="text" className="form-control" name="cpfResponsavel" value={formData.cpfResponsavel} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Nome do esposo(a):</label>
              <input type="text" className="form-control" name="nomeConjuge" value={formData.nomeConjuge} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Identificador de outro sistema:</label>
              <input type="text" className="form-control" name="outroId" value={formData.outroId} onChange={handleChange} />
            </div>
            <div className="col-md-12 mb-3">
              <div className="form-check">
                <input className="form-check-input" type="checkbox" name="rnConvenio" checked={formData.rnConvenio} onChange={handleChange} id="rnConvenio" />
                <label className="form-check-label" htmlFor="rnConvenio">
                  RN na Guia do convênio
                </label>
              </div>
            </div>
          </div>
        </div>
      </div>
      
      {/* INFORMAÇÕES MÉDICAS */}
      <div className="mb-5"> 
        <h5 className="fs-4 mb-0 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('infoMedicas')}>
          Informações Médicas
          <span className="fs-5">
            {collapsedSections.infoMedicas ? '▲' : '▼'}
          </span>
        </h5>
        <div className={`collapse${collapsedSections.infoMedicas ? ' show' : ''}`}>
          <div className="row mt-3">
            <div className="col-md-6 mb-3">
              <label>Tipo Sanguíneo:</label>
              <select className="form-control" name="tipoSanguineo" value={formData.tipoSanguineo} onChange={handleChange}>
                <option value="">Selecione</option>
                <option value="A+">A+</option>
                <option value="A-">A-</option>
                <option value="B+">B+</option>
                <option value="B-">B-</option>
                <option value="AB+">AB+</option>
                <option value="AB-">AB-</option>
                <option value="O+">O+</option>
                <option value="O-">O-</option>
              </select>
            </div>
            <div className="col-md-2 mb-3">
              <label>Peso (kg):</label>
              <input type="number" step="0.1" className="form-control" name="peso" value={formData.peso} onChange={handleChange} />
            </div>
            <div className="col-md-2 mb-3">
              <label>Altura (m):</label>
              <input type="number" step="0.01" className="form-control" name="altura" value={formData.altura} onChange={handleChange} />
            </div>
            <div className="col-md-2 mb-3">
              <label>IMC (kg/m²):</label>
              <input type="text" className="form-control" name="imc" value={formData.imc} readOnly disabled />
            </div>
            <div className="col-md-12 mb-3">
              <label>Alergias:</label>
              <textarea className="form-control" name="alergias" value={formData.alergias} onChange={handleChange} placeholder="Ex: AAS, Dipirona, etc"></textarea>
            </div>
          </div>
        </div>
      </div>

      {/* INFORMAÇÕES DE CONVÊNIO */}
      <div className="mb-5"> 
        <h5 className="fs-4 mb-0 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('infoConvenio')}>
          Informações de convênio
          <span className="fs-5">
            {collapsedSections.infoConvenio ? '▲' : '▼'}
          </span>
        </h5>
        <div className={`collapse${collapsedSections.infoConvenio ? ' show' : ''}`}>
          <div className="row mt-3">
            <div className="col-md-6 mb-3">
              <label>Convênio:</label>
              <select className="form-control" name="convenio" value={formData.convenio} onChange={handleChange}>
                <option value="">Selecione</option>
                <option value="Amil">Amil</option>
                <option value="Bradesco Saúde">Bradesco Saúde</option>
                <option value="SulAmérica">SulAmérica</option>
                <option value="Unimed">Unimed</option>
              </select>
            </div>
            <div className="col-md-6 mb-3">
              <label>Plano:</label>
              <input type="text" className="form-control" name="plano" value={formData.plano} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Nº de matrícula:</label>
              <input type="text" className="form-control" name="numeroMatricula" value={formData.numeroMatricula} onChange={handleChange} />
            </div>
            <div className="col-md-4 mb-3">
              <label>Validade da Carteira:</label>
              <input type="date" className="form-control" name="validadeCarteira" value={formData.validadeCarteira} onChange={handleChange} disabled={formData.validadeIndeterminada} />
            </div>
            <div className="col-md-2 d-flex align-items-end mb-3">
              <div className="form-check">
                <input className="form-check-input" type="checkbox" name="validadeIndeterminada" checked={formData.validadeIndeterminada} onChange={handleChange} id="validadeIndeterminada" />
                <label className="form-check-label" htmlFor="validadeIndeterminada">
                  Validade indeterminada
                </label>
              </div>
            </div>
            {/* PACIENTE VIP */}
            <div className="col-md-12 mb-3 mt-3">
              <div className="form-check">
                <input className="form-check-input" type="checkbox" name="pacienteVip" checked={formData.pacienteVip} onChange={handleChange} id="pacienteVip" />
                <label className="form-check-label" htmlFor="pacienteVip">
                  Paciente VIP
                </label>
              </div>
            </div>
          </div>
        </div>
      </div>

      {/* ENDEREÇO */}
      <div className="mb-5"> 
        <h5 className="fs-4 mb-0 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('endereco')}>
          Endereço
          <span className="fs-5">
            {collapsedSections.endereco ? '▲' : '▼'}
          </span>
        </h5>
        <div className={`collapse${collapsedSections.endereco ? ' show' : ''}`}>
          <div className="row mt-3">
            <div className="col-md-4 mb-3">
              <label>CEP:</label>
              <input type="text" className="form-control" name="cep" value={formData.cep} onChange={handleChange} onBlur={handleCepBlur} />
            </div>
            <div className="col-md-8 mb-3">
              <label>Rua:</label>
              <input type="text" className="form-control" name="rua" value={formData.rua} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Bairro:</label>
              <input type="text" className="form-control" name="bairro" value={formData.bairro} onChange={handleChange} />
            </div>
            <div className="col-md-4 mb-3">
              <label>Cidade:</label>
              <input type="text" className="form-control" name="cidade" value={formData.cidade} onChange={handleChange} />
            </div>
            <div className="col-md-2 mb-3">
              <label>Estado:</label>
              <input type="text" className="form-control" name="estado" value={formData.estado} onChange={handleChange} />
            </div>
            <div className="col-md-4 mb-3">
              <label>Número:</label>
              <input type="text" className="form-control" name="numero" value={formData.numero} onChange={handleChange} />
            </div>
            <div className="col-md-8 mb-3">
              <label>Complemento:</label>
              <input type="text" className="form-control" name="complemento" value={formData.complemento} onChange={handleChange} />
            </div>
          </div>
        </div>
      </div>

      {/* CONTATO */}
      <div className="mb-5"> 
        <h5 className="fs-4 mb-0 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('contato')}>
          Contato
          <span className="fs-5">
            {collapsedSections.contato ? '▲' : '▼'}
          </span>
        </h5>
        <div className={`collapse${collapsedSections.contato ? ' show' : ''}`}>
          <div className="row mt-3">
            <div className="col-md-6 mb-3">
              <label>Email: *</label>
              <input type="email" className="form-control" name="email" value={formData.email} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Telefone: *</label>
              <input type="text" className="form-control" name="telefone1" value={formData.telefone1} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Telefone 2:</label>
              <input type="text" className="form-control" name="telefone2" value={formData.telefone2} onChange={handleChange} />
            </div>
            <div className="col-md-6 mb-3">
              <label>Telefone 3:</label>
              <input type="text" className="form-control" name="telefone3" value={formData.telefone3} onChange={handleChange} />
            </div>
          </div>
        </div>
      </div>

      {/* INFORMAÇÕES ADICIONAIS */}
      <div className="mb-5"> {/* Aumentado para mb-5 para mais separação */}
        <h5 className="fs-4 mb-0 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('infoAdicionais')}>
          Informações Adicionais
          <span className="fs-5">
            {collapsedSections.infoAdicionais ? '▲' : '▼'}
          </span>
        </h5>
        <div className={`collapse${collapsedSections.infoAdicionais ? ' show' : ''}`}>
          <div className="row mt-3">
            <div className="mb-3">
              <label>Observações:</label>
              <textarea className="form-control" name="observacoes" value={formData.observacoes} onChange={handleChange}></textarea>
            </div>
          </div>
        </div>
      </div>
      
      {/* ANEXOS DO PACIENTE */}
      <div className="mb-5"> {/* Aumentado para mb-5 para mais separação */}
        <h5 className="fs-4 mb-0 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('anexos')}>
          Anexos do Paciente
          <span className="fs-5">
            {collapsedSections.anexos ? '▲' : '▼'}
          </span>
        </h5>
        <div className={`collapse${collapsedSections.anexos ? ' show' : ''}`}>
          <div className="row mt-3">
            <div className="mb-3">
              <label htmlFor="anexos-input" className="btn btn-secondary">Escolher arquivo</label>
              <input type="file" className="form-control d-none" name="anexos" id="anexos-input" onChange={handleChange} />
              <span className="ms-2">{formData.anexos ? formData.anexos.name : 'Nenhum arquivo escolhido'}</span>
            </div>
          </div>
        </div>
      </div>

      {/* Botões */}
      <div className="mt-3">
        <button className="btn btn-success me-2" onClick={handleSubmit}>
          Salvar Paciente
        </button>
        <button className="btn btn-light" onClick={onCancel}>
          Cancelar
        </button>
      </div>
    </div>
  );
}

export default PatientForm;