<?php
require_once(dirname(__DIR__) . '/config/db.php');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

// =========================================================
// GET PESSOA (JSON)
// =========================================================
if (isset($_GET['getPessoa'])) {
    header('Content-Type: application/json; charset=utf-8');
    try {
        $id = (int)$_GET['getPessoa'];

        $pessoa = $pdo->prepare("SELECT * FROM back.pessoa WHERE cdpessoa = :id");
        $pessoa->execute([':id' => $id]);
        $info = $pessoa->fetch(PDO::FETCH_ASSOC);

        $empresas = $pdo->prepare("SELECT cdempresa FROM back.pessoaempresa WHERE cdpessoa = :id");
        $empresas->execute([':id' => $id]);
        $empList = $empresas->fetchAll(PDO::FETCH_COLUMN);

        echo json_encode(['info' => $info, 'empresas' => $empList]);

    } catch (Exception $e) {
        echo json_encode(['erro' => $e->getMessage()]);
    }
    exit;
}

// =========================================================
// FILTROS E BUSCA
// =========================================================
$filtro = $_GET['status'] ?? 'ativas';

switch ($filtro) {
    case 'inativas': $where = "WHERE p.flativo = 1"; break;
    case 'todas':    $where = ""; break;
    default:         $where = "WHERE p.flativo IN (0, 2)";
}

$busca = trim($_GET['busca'] ?? '');
$whereBusca = $where;

if ($busca) {
    $whereBusca .= ($where ? " AND " : "WHERE ")
        . "(p.dspessoa ILIKE :busca OR p.email ILIKE :busca OR p.telefone ILIKE :busca OR p.documento ILIKE :busca)";
}

// =========================================================
// PAGINAÇÃO
// =========================================================
$limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 50;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $limit;
$limitSql = $limit == -1 ? "" : "LIMIT $limit OFFSET $offset";

// =========================================================
// CONSULTA PRINCIPAL
// =========================================================
$sql = "
    SELECT p.*, pa.dspais 
    FROM back.pessoa p 
    LEFT JOIN back.pais pa ON pa.cdpais = p.cdpais 
    $whereBusca
    ORDER BY p.dspessoa ASC
    $limitSql
";

$stmt = $pdo->prepare($sql);
if ($busca) $stmt->bindValue(':busca', "%$busca%");
$stmt->execute();
$pessoas = $stmt->fetchAll(PDO::FETCH_ASSOC);

$paises = isset($_SESSION['cache_paises']) 
    ? $_SESSION['cache_paises']
    : ($_SESSION['cache_paises'] = $pdo->query("SELECT cdpais, dspais FROM back.pais ORDER BY dspais")->fetchAll(PDO::FETCH_ASSOC));

$empresas = isset($_SESSION['cache_empresas']) 
    ? $_SESSION['cache_empresas']
    : ($_SESSION['cache_empresas'] = $pdo->query("SELECT cdempresa, dsempresa FROM back.empresa ORDER BY dsempresa")->fetchAll(PDO::FETCH_ASSOC));

$grupos = isset($_SESSION['cache_grupos']) 
    ? $_SESSION['cache_grupos']
    : ($_SESSION['cache_grupos'] = $pdo->query("SELECT cdgrupopermissao, dsgrupopermissao FROM back.grupopermissao WHERE flativo=0 ORDER BY dsgrupopermissao")->fetchAll(PDO::FETCH_ASSOC));

// =========================================================
// SALVAR / ATUALIZAR
// =========================================================
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['salvar'])) {
    try {

        $pdo->beginTransaction();

        $id = !empty($_POST['cdpessoa']) ? (int)$_POST['cdpessoa'] : null;
        $flusuario = isset($_POST['flusuario']);

        // validações
        if (empty($_POST['dspessoa'])) {
            throw new Exception("Nome é obrigatório.");
        }

        if (
            !isset($_POST['flcliente']) &&
            !isset($_POST['flfornecedor']) &&
            !isset($_POST['flfuncionario'])
        ) {
            throw new Exception("Selecione ao menos uma atribuição (Cliente, Fornecedor ou Funcionário).");
        }

        // Capturar flativo para todos (usuário ou não)
        $flativo = isset($_POST['flativo']) ? (int)$_POST['flativo'] : 0;

        if ($flusuario) {
            if (empty($_POST['dsusuario'])) throw new Exception("Usuário é obrigatório.");
            
            // Se flativo = 2 (alterar senha), SEMPRE obriga senha
            if ($flativo == 2) {
                if (empty($_POST['senha'])) throw new Exception("Senha é obrigatória ao selecionar 'Alterar Senha no Próximo Login'.");
            } else if (!$id) {
                // Para novo usuário com outro status, senha é obrigatória
                if (empty($_POST['senha'])) throw new Exception("Senha é obrigatória.");
            }
            // Para usuários existentes com flativo ≠ 2, senha é opcional (mantém a atual)
            
            if (empty($_POST['cdgrupopermissao'])) throw new Exception("Grupo de permissão é obrigatório.");
            if (empty($_POST['empresas'])) throw new Exception("Selecione ao menos uma empresa.");

            // Validar visões do dashboard
            $temVisao = isset($_POST['fl_visao_detalhado']) || isset($_POST['fl_visao_consolidado'])
                     || isset($_POST['fl_visao_percentual']) || isset($_POST['fl_visao_planilha']);
            if (!$temVisao) {
                throw new Exception("Selecione ao menos uma visão do dashboard.");
            }
            if (empty($_POST['visao_padrao'])) {
                throw new Exception("Selecione a visão padrão do dashboard.");
            }
            $visaoPadrao = $_POST['visao_padrao'];
            $visoesValidas = ['detalhado', 'consolidado', 'percentual', 'planilha'];
            if (!in_array($visaoPadrao, $visoesValidas, true)) {
                throw new Exception("Visão padrão inválida.");
            }
            $flagVisao = 'fl_visao_' . $visaoPadrao;
            if (!isset($_POST[$flagVisao])) {
                throw new Exception("A visão padrão deve ser uma das visões habilitadas.");
            }
            
            // Validar senha forte (apenas se informada)
            if (!empty($_POST['senha'])) {
                $senha = $_POST['senha'];
                if (strlen($senha) < 6) {
                    throw new Exception("Senha deve ter pelo menos 6 caracteres.");
                }
                if (!preg_match('/[A-Z]/', $senha)) {
                    throw new Exception("Senha deve conter pelo menos 1 letra maiúscula.");
                }
                if (!preg_match('/[0-9]/', $senha)) {
                    throw new Exception("Senha deve conter pelo menos 1 número.");
                }
                if (!preg_match('/[!@#$%^&*()\-_=+\[\]{};:\'"<>,.?\\/\\|`~]/', $senha)) {
                    throw new Exception("Senha deve conter pelo menos 1 símbolo (!@#$%^&*).");
                }
            }
        }

        // montar dados
        $dados = [
            ':dspessoa' => trim($_POST['dspessoa']),
            ':cdpais' => $_POST['cdpais'] ?: null,
            ':documento' => trim($_POST['documento']),
            ':email' => trim($_POST['email']),
            ':telefone' => trim($_POST['telefone']),
            ':cep' => trim($_POST['cep']),
            ':logradouro' => trim($_POST['logradouro']),
            ':numero' => trim($_POST['numero']),
            ':bairro' => trim($_POST['bairro']),
            ':cidade' => trim($_POST['cidade']),
            ':estado' => trim($_POST['estado']),
            ':flusuario' => $flusuario ? 'true' : 'false',
            ':dsusuario' => $_POST['dsusuario'] ?: null,
            ':senha' => (!empty($_POST['senha']) ? password_hash($_POST['senha'], PASSWORD_DEFAULT) : null),
            ':cdgrupopermissao' => $_POST['cdgrupopermissao'] ?: null,
            ':flativo' => $flativo,

            ':flcliente'     => isset($_POST['flcliente']) ? 'true' : 'false',
            ':flfornecedor'  => isset($_POST['flfornecedor']) ? 'true' : 'false',
            ':flfuncionario' => isset($_POST['flfuncionario']) ? 'true' : 'false',

            ':fl_visao_detalhado'   => isset($_POST['fl_visao_detalhado']) ? 'true' : 'false',
            ':fl_visao_consolidado' => isset($_POST['fl_visao_consolidado']) ? 'true' : 'false',
            ':fl_visao_percentual'  => isset($_POST['fl_visao_percentual']) ? 'true' : 'false',
            ':fl_visao_planilha'    => isset($_POST['fl_visao_planilha']) ? 'true' : 'false',
            ':visao_padrao'         => !empty($_POST['visao_padrao']) ? $_POST['visao_padrao'] : null,
        ];

        // UPDATE
        if ($id) {

            $dados[':cdpessoa'] = $id;

            $sql = "UPDATE back.pessoa SET 
                        dspessoa=:dspessoa, cdpais=:cdpais, documento=:documento, email=:email, telefone=:telefone,
                        cep=:cep, logradouro=:logradouro, numero=:numero, bairro=:bairro, cidade=:cidade, estado=:estado,
                        flusuario=:flusuario, dsusuario=:dsusuario,
                        senha=COALESCE(:senha, senha),
                        cdgrupopermissao=:cdgrupopermissao,
                        flativo=:flativo,
                        flcliente=:flcliente,
                        flfornecedor=:flfornecedor,
                        flfuncionario=:flfuncionario,
                        fl_visao_detalhado=:fl_visao_detalhado,
                        fl_visao_consolidado=:fl_visao_consolidado,
                        fl_visao_percentual=:fl_visao_percentual,
                        fl_visao_planilha=:fl_visao_planilha,
                        visao_padrao=:visao_padrao
                    WHERE cdpessoa=:cdpessoa";

            $stmt = $pdo->prepare($sql);
            $stmt->execute($dados);

        }
        // INSERT
        else {

            $sql = "INSERT INTO back.pessoa 
                    (dspessoa, cdpais, documento, email, telefone, cep, logradouro, numero, bairro, cidade, estado,
                     flusuario, dsusuario, senha, cdgrupopermissao, flativo,
                     flcliente, flfornecedor, flfuncionario,
                     fl_visao_detalhado, fl_visao_consolidado, fl_visao_percentual, fl_visao_planilha, visao_padrao)
                    VALUES 
                    (:dspessoa, :cdpais, :documento, :email, :telefone, :cep, :logradouro, :numero, :bairro, :cidade, :estado,
                     :flusuario, :dsusuario, :senha, :cdgrupopermissao, :flativo,
                     :flcliente, :flfornecedor, :flfuncionario,
                     :fl_visao_detalhado, :fl_visao_consolidado, :fl_visao_percentual, :fl_visao_planilha, :visao_padrao)
                    RETURNING cdpessoa";

            $stmt = $pdo->prepare($sql);
            $stmt->execute($dados);

            $id = $stmt->fetchColumn();
        }

        // empresas vinculadas
        $pdo->prepare("DELETE FROM back.pessoaempresa WHERE cdpessoa=:id")
            ->execute([':id' => $id]);

        if ($flusuario && !empty($_POST['empresas'])) {
            $ins = $pdo->prepare("INSERT INTO back.pessoaempresa (cdpessoa, cdempresa) VALUES (:p, :e)");
            foreach ($_POST['empresas'] as $emp) {
                $ins->execute([':p' => $id, ':e' => $emp]);
            }
        }

        $pdo->commit();

        echo "<script>alert('Pessoa salva com sucesso!'); window.location='?m=pessoas';</script>";
        exit;

    } catch (Exception $e) {
        $pdo->rollBack();
        echo "<div class='alert alert-danger'>Erro ao salvar: " . htmlspecialchars($e->getMessage()) . "</div>";
    }
}
?>

<h4 class="mb-3"><i class="bi bi-person-lines-fill"></i> Cadastro de Pessoas</h4>
<hr>

<div class="d-flex justify-content-between align-items-center mb-3">

  <div>
    <a href="?m=pessoas&status=ativas" class="btn btn-outline-success btn-sm <?= $filtro=='ativas'?'active':'' ?>">Ativos</a>
    <a href="?m=pessoas&status=inativas" class="btn btn-outline-secondary btn-sm <?= $filtro=='inativas'?'active':'' ?>">Inativos</a>
    <a href="?m=pessoas&status=todas" class="btn btn-outline-dark btn-sm <?= $filtro=='todas'?'active':'' ?>">Todos</a>
  </div>

  <div class="d-flex align-items-center justify-content-between flex-wrap w-50">
    <div class="flex-grow-1 d-flex justify-content-center">
      <div class="input-group input-group-sm" style="max-width: 400px;">
        <input class="form-control" id="busca" placeholder="Pesquisar pessoa...">
        <button class="btn btn-outline-secondary" id="btnBusca"><i class="bi bi-search"></i></button>
      </div>
    </div>

    <button class="btn btn-outline-light btn-sm border-secondary text-dark bg-light"
            data-bs-toggle="modal" data-bs-target="#modalPessoa" id="btnNovaPessoa">
      <i class="bi bi-plus-circle"></i> Nova Pessoa
    </button>
  </div>

</div>

<div id="tabelaPessoas">

  <table class="table table-striped table-hover align-middle">
    <thead class="table-dark">
      <tr>
        <th>Nome</th>
        <th>Tipo</th>
        <th>Email</th>
        <th>Telefone</th>
        <th>Status</th>
        <th class="text-center">Ações</th>
      </tr>
    </thead>

    <tbody>

<?php if ($pessoas): foreach ($pessoas as $p): ?>

<tr>
  <td><?= htmlspecialchars($p['dspessoa']) ?></td>

  <td>
    <?php if ($p['flcliente']) echo '<span class="badge bg-primary me-1">Cliente</span>'; ?>
    <?php if ($p['flfornecedor']) echo '<span class="badge bg-warning text-dark me-1">Fornecedor</span>'; ?>
    <?php if ($p['flfuncionario']) echo '<span class="badge bg-info text-dark me-1">Funcionário</span>'; ?>
  </td>

  <td><?= htmlspecialchars($p['email']) ?></td>
  <td><?= htmlspecialchars($p['telefone']) ?></td>

  <td>
    <?php 
      if ($p['flativo'] == 0) {
        echo '<span class="badge bg-success">Ativo</span>';
      } elseif ($p['flativo'] == 1) {
        echo '<span class="badge bg-danger">Inativo</span>';
      } elseif ($p['flativo'] == 2) {
        echo '<span class="badge bg-warning">Alterar Senha</span>';
      } else {
        echo '<span class="badge bg-dark">Bloqueado</span>';
      }
    ?>
  </td>

  <td class="text-center">

    <button class="btn btn-sm btn-outline-secondary btnEditar"
            data-id="<?= $p['cdpessoa'] ?>">
        <i class="bi bi-pencil"></i>
    </button>

  </td>

</tr>

<?php endforeach; else: ?>

<tr><td colspan="6" class="text-center text-muted">Nenhum registro encontrado.</td></tr>

<?php endif; ?>

    </tbody>
  </table>

  <!-- controle de exibição -->
  <div class="d-flex justify-content-between align-items-center mt-2 flex-wrap gap-2">
    <div class="text-muted small">
      Exibindo <?= count($pessoas) ?> registros
    </div>

    <div class="d-flex align-items-center gap-2">
      <label class="small text-muted mb-0">Exibir:</label>

      <select class="form-select form-select-sm w-auto"
              onchange="location.href='?m=pessoas&limit='+this.value">
        <option value="25"  <?= $limit==25?'selected':'' ?>>25</option>
        <option value="50"  <?= $limit==50?'selected':'' ?>>50</option>
        <option value="100" <?= $limit==100?'selected':'' ?>>100</option>
        <option value="200" <?= $limit==200?'selected':'' ?>>200</option>
        <option value="-1"  <?= $limit==-1?'selected':'' ?>>Todos</option>
      </select>
    </div>
  </div>

</div>

<!-- MODAL -->
<div class="modal fade" id="modalPessoa" tabindex="-1">
  <div class="modal-dialog modal-lg modal-dialog-scrollable">
    <form method="post" class="modal-content" id="formPessoa">

      <div class="modal-header">
        <h5 class="modal-title">Cadastrar Pessoa</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>

      <div class="modal-body">

        <input type="hidden" name="cdpessoa" id="cdpessoa">

        <div class="row g-3">

          <div class="col-md-8">
            <label>Nome *</label>
            <input type="text" class="form-control" name="dspessoa" id="dspessoa" required>
          </div>

          <div class="col-md-4">
            <label>País</label>
            <select class="form-select" name="cdpais" id="cdpais">
              <option value="">Selecione...</option>
              <?php foreach ($paises as $p): ?>
                <option value="<?= $p['cdpais'] ?>"><?= htmlspecialchars($p['dspais']) ?></option>
              <?php endforeach; ?>
            </select>
          </div>

          <div class="col-md-4"><label>Telefone</label></label>
            <input type="text" class="form-control" name="telefone" id="telefone">
          </div>

          <div class="col-md-4"><label>Email</label></label>
            <input type="email" class="form-control" name="email" id="email">
          </div>

          <div class="col-md-4"><label>Documento</label></label>
            <input type="text" class="form-control" name="documento" id="documento">
          </div>

          <div class="col-md-3">
            <label>CEP</label>
            <div class="input-group">
              <input type="text" class="form-control" name="cep" id="cep">
              <button type="button" class="btn btn-outline-secondary" id="btnBuscaCEP"><i class="bi bi-search"></i></button>
            </div>
          </div>

          <div class="col-md-5">
            <label>Logradouro</label>
            <input type="text" class="form-control" name="logradouro" id="logradouro">
          </div>

          <div class="col-md-2">
            <label>Número</label>
            <input type="text" class="form-control" name="numero" id="numero">
          </div>

          <div class="col-md-4">
            <label>Bairro</label>
            <input type="text" class="form-control" name="bairro" id="bairro">
          </div>

          <div class="col-md-4">
            <label>Cidade</label>
            <input type="text" class="form-control" name="cidade" id="cidade">
          </div>

          <div class="col-md-4">
            <label>Estado</label>
            <input type="text" class="form-control" name="estado" id="estado">
          </div>

        </div>

        <hr>

        <!-- TIPO DE PESSOA -->
        <h6 class="fw-bold">Tipo de Pessoa *</h6>

        <div class="row mb-3">

          <div class="col-md-4">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" name="flcliente" id="flcliente">
              <label class="form-check-label" for="flcliente">Cliente</label>
            </div>
          </div>

          <div class="col-md-4">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" name="flfornecedor" id="flfornecedor">
              <label class="form-check-label" for="flfornecedor">Fornecedor</label>
            </div>
          </div>

          <div class="col-md-4">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" name="flfuncionario" id="flfuncionario">
              <label class="form-check-label" for="flfuncionario">Funcionário</label>
            </div>
          </div>

        </div>

        <hr>

        <!-- USUÁRIO DO SISTEMA -->
        <div class="form-check">
          <input class="form-check-input" type="checkbox" name="flusuario" id="flusuario">
          <label class="form-check-label fw-bold" for="flusuario">É Usuário do Sistema</label>
        </div>

        <div id="dadosUsuario" class="mt-3" style="display:none;">

          <div class="row g-3">

            <div class="col-md-4">
              <label>Usuário *</label>
              <input type="text" class="form-control" name="dsusuario" id="dsusuario">
            </div>

            <div class="col-md-4">
              <label>Senha *</label>
              <input type="password" class="form-control" name="senha" id="senha">
              <div id="alertaSenha" class="invalid-feedback small mt-1" style="display: none;">
                Senha fraca. Mín. 6 caracteres, 1 maiúscula, 1 número, 1 símbolo.
              </div>
            </div>

            <div class="col-md-4">
              <label>Grupo de Permissão *</label>
              <select class="form-select" name="cdgrupopermissao" id="cdgrupopermissao">
                <option value="">Selecione...</option>
                <?php foreach ($grupos as $g): ?>
                  <option value="<?= $g['cdgrupopermissao'] ?>"><?= htmlspecialchars($g['dsgrupopermissao']) ?></option>
                <?php endforeach; ?>
              </select>
            </div>

          </div>

          <div class="row g-3 mt-3">
            <div class="col-md-6">
              <label>Status *</label>
              <select class="form-select" name="flativo" id="flativo">
                <option value="0">Ativo</option>
                <option value="1">Inativo</option>
                <option value="2">Alterar no Próximo Login</option>
                <option value="3">Bloqueado</option>
              </select>
            </div>
          </div>

          <!-- Visões do Dashboard que o usuário pode acessar -->
          <div class="mt-3">
            <label class="fw-semibold">Visões do Dashboard *</label>
            <div class="border rounded p-2">
              <div class="form-check form-check-inline">
                <input class="form-check-input visao-check" type="checkbox" name="fl_visao_detalhado" id="fl_visao_detalhado" data-visao="detalhado" checked>
                <label class="form-check-label" for="fl_visao_detalhado">Detalhado</label>
              </div>
              <div class="form-check form-check-inline">
                <input class="form-check-input visao-check" type="checkbox" name="fl_visao_consolidado" id="fl_visao_consolidado" data-visao="consolidado" checked>
                <label class="form-check-label" for="fl_visao_consolidado">Consolidado</label>
              </div>
              <div class="form-check form-check-inline">
                <input class="form-check-input visao-check" type="checkbox" name="fl_visao_percentual" id="fl_visao_percentual" data-visao="percentual" checked>
                <label class="form-check-label" for="fl_visao_percentual">Percentual</label>
              </div>
              <div class="form-check form-check-inline">
                <input class="form-check-input visao-check" type="checkbox" name="fl_visao_planilha" id="fl_visao_planilha" data-visao="planilha" checked>
                <label class="form-check-label" for="fl_visao_planilha">Planilha</label>
              </div>
            </div>
          </div>

          <div class="mt-2">
            <label class="fw-semibold">Visão Padrão *</label>
            <select class="form-select form-select-sm" name="visao_padrao" id="visao_padrao">
              <option value="">Selecione...</option>
              <option value="detalhado">Detalhado</option>
              <option value="consolidado">Consolidado</option>
              <option value="percentual">Percentual</option>
              <option value="planilha">Planilha</option>
            </select>
          </div>

          <div class="mt-3">
            <label>Empresas que o usuário pode acessar *</label>

            <div class="border rounded p-2" style="max-height:150px; overflow-y:auto;">
              <?php foreach ($empresas as $e): ?>
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="empresas[]" value="<?= $e['cdempresa'] ?>" id="emp<?= $e['cdempresa'] ?>">
                <label class="form-check-label" for="emp<?= $e['cdempresa'] ?>">
                  <?= htmlspecialchars($e['dsempresa']) ?>
                </label>
              </div>
              <?php endforeach; ?>
            </div>

          </div>

        </div>

      </div>

      <div class="modal-footer">
        <button type="submit" name="salvar" class="btn btn-success">Salvar</button>
      </div>

    </form>
  </div>
</div>



<!-- JS -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.min.js"></script>

<script>
// Função para validar senha forte
function validarSenhaForte(senha) {
  const minCaracteres = senha.length >= 6;
  const temMaiuscula = /[A-Z]/.test(senha);
  const temNumero = /[0-9]/.test(senha);
  const temSimbolo = /[!@#$%^&*()\-_=+\[\]{};:'"<>,.?\/\\|`~]/.test(senha);
  
  return minCaracteres && temMaiuscula && temNumero && temSimbolo;
}

// Atualiza opções do select Visão Padrão conforme checkboxes marcados
function atualizarOpcoesVisaoPadrao() {
  const sel = $('#visao_padrao');
  const atual = sel.val();
  sel.find('option').not(':first').each(function() {
    const visao = $(this).val();
    const check = $('#fl_visao_' + visao);
    if (check.length && !check.prop('checked')) {
      $(this).prop('disabled', true).css('color', '#aaa');
      if (atual === visao) sel.val('');
    } else {
      $(this).prop('disabled', false).css('color', '');
    }
  });
}

$(function(){

  $('#telefone').mask('(00) 00000-0000');

  // Quando marcar/desmarcar visão, atualiza opções do select padrão
  $(document).on('change', '.visao-check', function() {
    atualizarOpcoesVisaoPadrao();
  });
  $('#cep').mask('00000-000');

  // Ao alterar flativo, validar se precisa de senha
  $('#flativo').on('change', function() {
    if ($(this).val() == 2) {
      // Se selecionou "Alterar Senha", deixar claro que precisa de senha
    } else {
      // Limpar alerta se selecionar outro status
      $('#alertaSenha').hide();
      $('#senha').removeClass('is-invalid');
    }
  });

  // Limpar alerta quando marcar/desmarcar flusuario
  $('#flusuario').on('change', function() {
    $('#alertaSenha').hide();
    $('#senha').removeClass('is-invalid');
  });

  $('#flusuario').on('change', () => {
    $('#dadosUsuario').toggle($('#flusuario').prop('checked'));
  });

  // CPF máscara BR
  $('#cdpais').on('change', function(){
    if ($(this).find('option:selected').text().toLowerCase().includes('brasil'))
      $('#documento').mask('000.000.000-00');
    else
      $('#documento').unmask();
  });

  // busca CEP
  $('#btnBuscaCEP').on('click', function(){
    const cep = $('#cep').val().replace(/\D/g, '');
    if (cep.length !== 8) return alert('CEP inválido.');

    $.getJSON(`https://viacep.com.br/ws/${cep}/json/`, d => {
      if (!('erro' in d)) {
        $('#logradouro').val(d.logradouro);
        $('#bairro').val(d.bairro);
        $('#cidade').val(d.localidade);
        $('#estado').val(d.uf);
      } else alert('CEP não encontrado.');
    });
  });

  // EDITAR - com event delegation para evitar handler duplicado
  $(document).on('click', '.btnEditar', async function(){

    const id = $(this).data('id');

    const res = await fetch(`?m=pessoas&getPessoa=${id}`);
    const p = await res.json();

    if (p.erro) return alert('Erro: ' + p.erro);

    $('#formPessoa')[0].reset();

    $('#cdpessoa').val(id);
    $('#dspessoa').val(p.info.dspessoa);
    $('#cdpais').val(p.info.cdpais);
    $('#telefone').val(p.info.telefone);
    $('#email').val(p.info.email);
    $('#documento').val(p.info.documento);
    $('#cep').val(p.info.cep);
    $('#logradouro').val(p.info.logradouro);
    $('#numero').val(p.info.numero);
    $('#bairro').val(p.info.bairro);
    $('#cidade').val(p.info.cidade);
    $('#estado').val(p.info.estado);

    // tipos pessoa
    $('#flcliente').prop('checked', p.info.flcliente);
    $('#flfornecedor').prop('checked', p.info.flfornecedor);
    $('#flfuncionario').prop('checked', p.info.flfuncionario);

    // usuário
    $('#flusuario').prop('checked', p.info.flusuario);
    $('#dadosUsuario').toggle(p.info.flusuario);
    $('#dsusuario').val(p.info.dsusuario);
    $('#cdgrupopermissao').val(p.info.cdgrupopermissao);
    $('#flativo').val(p.info.flativo);

    // Limpar alerta de senha
    $('#alertaSenha').hide();
    $('#senha').removeClass('is-invalid');

    // visões do dashboard
    $('#fl_visao_detalhado').prop('checked', p.info.fl_visao_detalhado);
    $('#fl_visao_consolidado').prop('checked', p.info.fl_visao_consolidado);
    $('#fl_visao_percentual').prop('checked', p.info.fl_visao_percentual);
    $('#fl_visao_planilha').prop('checked', p.info.fl_visao_planilha);
    atualizarOpcoesVisaoPadrao();
    $('#visao_padrao').val(p.info.visao_padrao || '');

    // empresas
    $('input[name="empresas[]"]').prop('checked', false);
    if (p.empresas) {
        p.empresas.forEach(e => $('#emp' + e).prop('checked', true));
    }

    new bootstrap.Modal('#modalPessoa').show();
  });

  // NOVO
  $('#btnNovaPessoa').on('click', function(){
    $('#formPessoa')[0].reset();
    $('#alertaSenha').hide();
    $('#senha').removeClass('is-invalid');
    $('#dadosUsuario').hide();
    $('input[name="empresas[]"]').prop('checked', false);
    // Visões do dashboard: marcar todas por padrão
    $('#fl_visao_detalhado').prop('checked', true);
    $('#fl_visao_consolidado').prop('checked', true);
    $('#fl_visao_percentual').prop('checked', true);
    $('#fl_visao_planilha').prop('checked', true);
    atualizarOpcoesVisaoPadrao();
    $('#visao_padrao').val('detalhado');
  });

  // VALIDAÇÕES
  $('#formPessoa').on('submit', function(e){

    if (
      !$('#flcliente').prop('checked') &&
      !$('#flfornecedor').prop('checked') &&
      !$('#flfuncionario').prop('checked')
    ) {
        alert('Selecione ao menos uma atribuição (Cliente, Fornecedor ou Funcionário).');
        e.preventDefault();
        return false;
    }

    if ($('#flusuario').prop('checked')) {

      if (!$('#dsusuario').val().trim()) {
        alert('Preencha o campo Nome de Usuário.');
        $('#dsusuario').focus();
        e.preventDefault();
        return false;
      }

      if (!$('#senha').val().trim() && !$('#cdpessoa').val()) {
        alert('Preencha o campo Senha.');
        $('#senha').focus();
        e.preventDefault();
        return false;
      }

      if (!$('#cdgrupopermissao').val()) {
        alert('Selecione o grupo de permissão.');
        $('#cdgrupopermissao').focus();
        e.preventDefault();
        return false;
      }

      if ($('input[name="empresas[]"]:checked').length === 0) {
        alert('Selecione ao menos uma empresa.');
        e.preventDefault();
        return false;
      }
      // Validar visões do dashboard
      if ($('.visao-check:checked').length === 0) {
        alert('Selecione ao menos uma visão do dashboard.');
        e.preventDefault();
        return false;
      }

      if (!$('#visao_padrao').val()) {
        alert('Selecione a visão padrão do dashboard.');
        $('#visao_padrao').focus();
        e.preventDefault();
        return false;
      }
      // Se flativo = 2, SEMPRE obriga senha (novo ou existente)
      if ($('#flativo').val() == 2) {
        if (!$('#senha').val().trim()) {
          $('#alertaSenha').show();
          $('#senha').addClass('is-invalid').focus();
          e.preventDefault();
          return false;
        }
        // Validar senha forte quando flativo=2
        if (!validarSenhaForte($('#senha').val())) {
          $('#alertaSenha').show();
          $('#senha').addClass('is-invalid').focus();
          e.preventDefault();
          return false;
        }
      } else {
        // Quando flativo ≠ 2: validar senha APENAS se preenchida
        if ($('#senha').val().trim()) {
          if (!validarSenhaForte($('#senha').val())) {
            $('#alertaSenha').show();
            $('#senha').addClass('is-invalid').focus();
            e.preventDefault();
            return false;
          }
        }
      }
      // Limpar alerta se passou todas validações
      $('#alertaSenha').hide();
      $('#senha').removeClass('is-invalid');
    } else {
      // Limpar alerta quando não for usuário
      $('#alertaSenha').hide();
      $('#senha').removeClass('is-invalid');
    }

  });

  // Quando modal fecha, resetar flag
  $('#modalPessoa').on('hidden.bs.modal', function() {
    formSubmitting = false;
    $('[name="salvar"]').prop('disabled', false).text('Salvar');
  });

  // BUSCA COM DEBOUNCE — evita múltiplas requisições
  let buscaTimeout;
  $('#busca').on('keyup', function(){
    clearTimeout(buscaTimeout);
    const v = $(this).val().trim();
    
    buscaTimeout = setTimeout(() => {
      if (v.length > 0 || v === '') {
        $.get('?m=pessoas&status=<?= $filtro ?>&busca=' + encodeURIComponent(v), function(html){
          try {
            const tabela = $(html).find('#tabelaPessoas').html();
            $('#tabelaPessoas').html(tabela);
          } catch(e) {
            console.error('Erro ao atualizar tabela:', e);
          }
        }).fail(() => {
          console.warn('Erro na requisição de busca');
        });
      }
    }, 300); // aguarda 300ms de inatividade
  });

});
</script>
