<?php
include 'verifica_login.php';
requer_admin();
include 'conexao.php';
$clienteProjetoUtils = __DIR__ . '/config/cliente_projeto_utils.php';
if (!is_file($clienteProjetoUtils)) {
    die('Arquivo obrigatorio nao encontrado: config/cliente_projeto_utils.php');
}
require_once $clienteProjetoUtils;

if (!function_exists('garantir_estrutura_clientes_projetos')) {
    die('Funcao obrigatoria nao carregada: garantir_estrutura_clientes_projetos');
}

$conn = conectar_banco();
garantir_estrutura_clientes_projetos($conn);

function normalizar_cnpj(string $cnpj): string
{
    return preg_replace('/\D+/', '', $cnpj);
}

function cnpj_valido(string $cnpj): bool
{
    $cnpj = normalizar_cnpj($cnpj);

    if (strlen($cnpj) !== 14) {
        return false;
    }

    if (preg_match('/^(\d)\1{13}$/', $cnpj)) {
        return false;
    }

    $pesos1 = [5,4,3,2,9,8,7,6,5,4,3,2];
    $soma1 = 0;
    for ($i = 0; $i < 12; $i++) {
        $soma1 += (int)$cnpj[$i] * $pesos1[$i];
    }
    $resto1 = $soma1 % 11;
    $digito1 = ($resto1 < 2) ? 0 : 11 - $resto1;

    $pesos2 = [6,5,4,3,2,9,8,7,6,5,4,3,2];
    $soma2 = 0;
    for ($i = 0; $i < 13; $i++) {
        $soma2 += (int)$cnpj[$i] * $pesos2[$i];
    }
    $resto2 = $soma2 % 11;
    $digito2 = ($resto2 < 2) ? 0 : 11 - $resto2;

    return ((int)$cnpj[12] === $digito1) && ((int)$cnpj[13] === $digito2);
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $acao = $_POST['acao'] ?? '';

    if ($acao === 'salvar_cliente') {
        $id_cliente = (int)($_POST['id_cliente'] ?? 0);
        $nome_cliente = trim($_POST['nome_cliente'] ?? '');
        $documento = trim($_POST['documento'] ?? '');
        $cnpj_normalizado = normalizar_cnpj($documento);
        $email = trim($_POST['email'] ?? '');
        $telefone = trim($_POST['telefone'] ?? '');
        $ativo = (($_POST['ativo'] ?? 'S') === 'N') ? 'N' : 'S';

        if ($nome_cliente === '') {
            header('Location: clientes_bms.php?msg=erro&detalhe=' . urlencode('Informe o nome do cliente.'));
            exit;
        }

        if ($cnpj_normalizado === '' || !cnpj_valido($cnpj_normalizado)) {
            header('Location: clientes_bms.php?msg=erro&detalhe=' . urlencode('Informe um CNPJ válido.'));
            exit;
        }

        if ($id_cliente > 0) {
            $stmt = $conn->prepare("UPDATE clientes_bms SET nome_cliente = ?, documento = ?, email = ?, telefone = ?, ativo = ? WHERE id_cliente = ?");
            if ($stmt) {
                $stmt->bind_param('sssssi', $nome_cliente, $cnpj_normalizado, $email, $telefone, $ativo, $id_cliente);
                $stmt->execute();
                $stmt->close();
            }
        } else {
            $stmt = $conn->prepare("INSERT INTO clientes_bms (nome_cliente, documento, email, telefone, ativo) VALUES (?, ?, ?, ?, ?)");
            if ($stmt) {
                $stmt->bind_param('sssss', $nome_cliente, $cnpj_normalizado, $email, $telefone, $ativo);
                $stmt->execute();
                $stmt->close();
            }
        }

        header('Location: clientes_bms.php?msg=sucesso');
        exit;
    }

    if ($acao === 'salvar_contato') {
        $id_contato = (int)($_POST['id_contato'] ?? 0);
        $id_cliente_fk = (int)($_POST['id_cliente_fk'] ?? 0);
        $nome_contato = trim($_POST['nome_contato'] ?? '');
        $cargo = trim($_POST['cargo'] ?? '');
        $email = trim($_POST['email'] ?? '');
        $telefone = trim($_POST['telefone'] ?? '');
        $observacoes = trim($_POST['observacoes'] ?? '');
        $ativo = (($_POST['ativo'] ?? 'S') === 'N') ? 'N' : 'S';

        if ($id_cliente_fk <= 0 || $nome_contato === '') {
            header('Location: clientes_bms.php?id_cliente=' . $id_cliente_fk . '&msg=erro&detalhe=' . urlencode('Informe cliente e nome do contato.'));
            exit;
        }

        if ($id_contato > 0) {
            $stmt = $conn->prepare("UPDATE clientes_bms_contatos SET nome_contato = ?, cargo = ?, email = ?, telefone = ?, observacoes = ?, ativo = ? WHERE id_contato = ? AND id_cliente_fk = ?");
            if ($stmt) {
                $stmt->bind_param('ssssssii', $nome_contato, $cargo, $email, $telefone, $observacoes, $ativo, $id_contato, $id_cliente_fk);
                $stmt->execute();
                $stmt->close();
            }
        } else {
            $stmt = $conn->prepare("INSERT INTO clientes_bms_contatos (id_cliente_fk, nome_contato, cargo, email, telefone, observacoes, ativo) VALUES (?, ?, ?, ?, ?, ?, ?)");
            if ($stmt) {
                $stmt->bind_param('issssss', $id_cliente_fk, $nome_contato, $cargo, $email, $telefone, $observacoes, $ativo);
                $stmt->execute();
                $stmt->close();
            }
        }

        header('Location: clientes_bms.php?id_cliente=' . $id_cliente_fk . '&msg=sucesso');
        exit;
    }

    if ($acao === 'excluir_contato') {
        $id_contato = (int)($_POST['id_contato'] ?? 0);
        $id_cliente_fk = (int)($_POST['id_cliente_fk'] ?? 0);
        if ($id_contato > 0 && $id_cliente_fk > 0) {
            $stmt = $conn->prepare("DELETE FROM clientes_bms_contatos WHERE id_contato = ? AND id_cliente_fk = ?");
            if ($stmt) {
                $stmt->bind_param('ii', $id_contato, $id_cliente_fk);
                $stmt->execute();
                $stmt->close();
            }
        }
        header('Location: clientes_bms.php?id_cliente=' . $id_cliente_fk . '&msg=sucesso');
        exit;
    }
}

$id_cliente = (int)($_GET['id_cliente'] ?? 0);
$id_contato_edit = (int)($_GET['id_contato'] ?? 0);
$cliente_edit = null;
$contato_edit = null;

if ($id_cliente > 0) {
    $stmt = $conn->prepare("SELECT * FROM clientes_bms WHERE id_cliente = ?");
    if ($stmt) {
        $stmt->bind_param('i', $id_cliente);
        $stmt->execute();
        $cliente_edit = $stmt->get_result()->fetch_assoc();
        $stmt->close();
    }
}

if ($id_contato_edit > 0 && $id_cliente > 0) {
    $stmt = $conn->prepare("SELECT * FROM clientes_bms_contatos WHERE id_contato = ? AND id_cliente_fk = ?");
    if ($stmt) {
        $stmt->bind_param('ii', $id_contato_edit, $id_cliente);
        $stmt->execute();
        $contato_edit = $stmt->get_result()->fetch_assoc();
        $stmt->close();
    }
}

$clientes = [];
$res = $conn->query("SELECT c.*, COUNT(cc.id_contato) AS total_contatos FROM clientes_bms c LEFT JOIN clientes_bms_contatos cc ON cc.id_cliente_fk = c.id_cliente GROUP BY c.id_cliente ORDER BY c.nome_cliente ASC");
if ($res) {
    while ($row = $res->fetch_assoc()) {
        $clientes[] = $row;
    }
}

$contatos_cliente = [];
if ($id_cliente > 0) {
    $stmt = $conn->prepare("SELECT * FROM clientes_bms_contatos WHERE id_cliente_fk = ? ORDER BY nome_contato ASC");
    if ($stmt) {
        $stmt->bind_param('i', $id_cliente);
        $stmt->execute();
        $result = $stmt->get_result();
        while ($row = $result->fetch_assoc()) {
            $contatos_cliente[] = $row;
        }
        $stmt->close();
    }
}
?>
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cadastro de Clientes BMS</title>
<style>
body { font-family: Arial, sans-serif; background: #f4f4f4; margin: 0; padding: 20px; }
.container { max-width: 1200px; margin: 0 auto; background: #fff; border-radius: 8px; padding: 20px; box-shadow: 0 0 10px rgba(0,0,0,.08); }
h1,h2 { color: #004d99; }
.grid { display: grid; grid-template-columns: 1fr 1.4fr; gap: 16px; }
label { display: block; font-weight: bold; margin: 8px 0 4px; }
input[type=text], input[type=email], textarea, select { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }
textarea { min-height: 70px; }
.btn { background: #004d99; color: #fff; border: none; padding: 8px 12px; border-radius: 4px; text-decoration: none; display: inline-block; cursor: pointer; }
.btn:hover { background: #003366; }
.btn-secondary { background: #6c757d; }
.btn-danger { background: #c62828; }
table { width: 100%; border-collapse: collapse; margin-top: 8px; }
th, td { border-bottom: 1px solid #eee; padding: 8px; text-align: left; font-size: .92em; }
th { background: #004d99; color: white; }
.msg { padding: 10px; border-radius: 4px; margin-bottom: 10px; }
.ok { background: #d4edda; color: #155724; }
.err { background: #f8d7da; color: #721c24; }
.small-actions { display: flex; gap: 6px; flex-wrap: wrap; }
</style>
</head>
<body>
<div class="container">
    <h1>👥 Cadastro de Clientes BMS</h1>
    <div style="margin-bottom:10px;"><a class="btn btn-secondary" href="principal.php">← Voltar</a></div>

    <?php if (isset($_GET['msg']) && $_GET['msg'] === 'sucesso'): ?>
        <div class="msg ok">Operação concluída com sucesso.</div>
    <?php elseif (isset($_GET['msg']) && $_GET['msg'] === 'erro'): ?>
        <div class="msg err"><?= htmlspecialchars($_GET['detalhe'] ?? 'Erro na operação.') ?></div>
    <?php endif; ?>

    <div class="grid">
        <div>
            <h2><?= $cliente_edit ? 'Editar Cliente' : 'Novo Cliente' ?></h2>
            <form method="post" action="clientes_bms.php">
                <input type="hidden" name="acao" value="salvar_cliente">
                <input type="hidden" name="id_cliente" value="<?= (int)($cliente_edit['id_cliente'] ?? 0) ?>">

                <label>Nome do Cliente *</label>
                <input type="text" name="nome_cliente" required maxlength="150" value="<?= htmlspecialchars($cliente_edit['nome_cliente'] ?? '') ?>">

                <label>CNPJ *</label>
                <input type="text" id="cnpj_cliente" name="documento" required maxlength="18" placeholder="00.000.000/0000-00" value="<?= htmlspecialchars($cliente_edit['documento'] ?? '') ?>">

                <label>Email</label>
                <input type="email" name="email" maxlength="150" value="<?= htmlspecialchars($cliente_edit['email'] ?? '') ?>">

                <label>Telefone</label>
                <input type="text" name="telefone" maxlength="30" value="<?= htmlspecialchars($cliente_edit['telefone'] ?? '') ?>">

                <label>Status</label>
                <select name="ativo">
                    <option value="S" <?= (($cliente_edit['ativo'] ?? 'S') === 'S') ? 'selected' : '' ?>>Ativo</option>
                    <option value="N" <?= (($cliente_edit['ativo'] ?? 'S') === 'N') ? 'selected' : '' ?>>Inativo</option>
                </select>

                <div style="margin-top:12px; display:flex; gap:8px;">
                    <button class="btn" type="submit"><?= $cliente_edit ? 'Salvar Cliente' : 'Cadastrar Cliente' ?></button>
                    <a class="btn btn-secondary" href="clientes_bms.php">Limpar</a>
                </div>
            </form>
        </div>

        <div>
            <h2>Clientes Cadastrados</h2>
            <table>
                <thead>
                    <tr><th>ID</th><th>Cliente</th><th>Status</th><th>Contatos</th><th>Ações</th></tr>
                </thead>
                <tbody>
                <?php if (count($clientes) > 0): foreach ($clientes as $c): ?>
                    <tr>
                        <td><?= (int)$c['id_cliente'] ?></td>
                        <td><?= htmlspecialchars($c['nome_cliente']) ?></td>
                        <td><?= ($c['ativo'] === 'S') ? 'Ativo' : 'Inativo' ?></td>
                        <td><?= (int)$c['total_contatos'] ?></td>
                        <td class="small-actions">
                            <a class="btn" href="clientes_bms.php?id_cliente=<?= (int)$c['id_cliente'] ?>">Editar</a>
                            <a class="btn btn-secondary" href="clientes_bms.php?id_cliente=<?= (int)$c['id_cliente'] ?>#contatos">Contatos</a>
                        </td>
                    </tr>
                <?php endforeach; else: ?>
                    <tr><td colspan="5">Nenhum cliente cadastrado.</td></tr>
                <?php endif; ?>
                </tbody>
            </table>
        </div>
    </div>

    <hr style="margin:20px 0;">

    <div id="contatos">
        <h2>📇 Contatos do Cliente <?= $cliente_edit ? '- ' . htmlspecialchars($cliente_edit['nome_cliente']) : '' ?></h2>

        <?php if (!$cliente_edit): ?>
            <div class="msg err">Selecione um cliente para cadastrar contatos.</div>
        <?php else: ?>
            <div class="grid">
                <div>
                    <h3><?= $contato_edit ? 'Editar Contato' : 'Novo Contato' ?></h3>
                    <form method="post" action="clientes_bms.php?id_cliente=<?= (int)$cliente_edit['id_cliente'] ?>#contatos">
                        <input type="hidden" name="acao" value="salvar_contato">
                        <input type="hidden" name="id_contato" value="<?= (int)($contato_edit['id_contato'] ?? 0) ?>">
                        <input type="hidden" name="id_cliente_fk" value="<?= (int)$cliente_edit['id_cliente'] ?>">

                        <label>Nome do Contato *</label>
                        <input type="text" name="nome_contato" maxlength="150" required value="<?= htmlspecialchars($contato_edit['nome_contato'] ?? '') ?>">

                        <label>Cargo</label>
                        <input type="text" name="cargo" maxlength="100" value="<?= htmlspecialchars($contato_edit['cargo'] ?? '') ?>">

                        <label>Email</label>
                        <input type="email" name="email" maxlength="150" value="<?= htmlspecialchars($contato_edit['email'] ?? '') ?>">

                        <label>Telefone</label>
                        <input type="text" name="telefone" maxlength="30" value="<?= htmlspecialchars($contato_edit['telefone'] ?? '') ?>">

                        <label>Observações</label>
                        <textarea name="observacoes"><?= htmlspecialchars($contato_edit['observacoes'] ?? '') ?></textarea>

                        <label>Status</label>
                        <select name="ativo">
                            <option value="S" <?= (($contato_edit['ativo'] ?? 'S') === 'S') ? 'selected' : '' ?>>Ativo</option>
                            <option value="N" <?= (($contato_edit['ativo'] ?? 'S') === 'N') ? 'selected' : '' ?>>Inativo</option>
                        </select>

                        <div style="margin-top:12px; display:flex; gap:8px;">
                            <button class="btn" type="submit"><?= $contato_edit ? 'Salvar Contato' : 'Cadastrar Contato' ?></button>
                            <a class="btn btn-secondary" href="clientes_bms.php?id_cliente=<?= (int)$cliente_edit['id_cliente'] ?>#contatos">Limpar</a>
                        </div>
                    </form>
                </div>

                <div>
                    <h3>Contatos Cadastrados</h3>
                    <table>
                        <thead>
                            <tr><th>Nome</th><th>Cargo</th><th>Email</th><th>Status</th><th>Ações</th></tr>
                        </thead>
                        <tbody>
                        <?php if (count($contatos_cliente) > 0): foreach ($contatos_cliente as $ct): ?>
                            <tr>
                                <td><?= htmlspecialchars($ct['nome_contato']) ?></td>
                                <td><?= htmlspecialchars($ct['cargo']) ?></td>
                                <td><?= htmlspecialchars($ct['email']) ?></td>
                                <td><?= ($ct['ativo'] === 'S') ? 'Ativo' : 'Inativo' ?></td>
                                <td class="small-actions">
                                    <a class="btn" href="clientes_bms.php?id_cliente=<?= (int)$cliente_edit['id_cliente'] ?>&id_contato=<?= (int)$ct['id_contato'] ?>#contatos">Editar</a>
                                    <form method="post" action="clientes_bms.php?id_cliente=<?= (int)$cliente_edit['id_cliente'] ?>#contatos" onsubmit="return confirm('Excluir este contato?');" style="margin:0;">
                                        <input type="hidden" name="acao" value="excluir_contato">
                                        <input type="hidden" name="id_cliente_fk" value="<?= (int)$cliente_edit['id_cliente'] ?>">
                                        <input type="hidden" name="id_contato" value="<?= (int)$ct['id_contato'] ?>">
                                        <button class="btn btn-danger" type="submit">Excluir</button>
                                    </form>
                                </td>
                            </tr>
                        <?php endforeach; else: ?>
                            <tr><td colspan="5">Nenhum contato cadastrado para este cliente.</td></tr>
                        <?php endif; ?>
                        </tbody>
                    </table>
                </div>
            </div>
        <?php endif; ?>
    </div>
</div>
</div>
<script>
function aplicarMascaraCnpj(valor) {
    const numeros = (valor || '').replace(/\D/g, '').slice(0, 14);
    if (numeros.length <= 2) return numeros;
    if (numeros.length <= 5) return numeros.replace(/^(\d{2})(\d+)/, '$1.$2');
    if (numeros.length <= 8) return numeros.replace(/^(\d{2})(\d{3})(\d+)/, '$1.$2.$3');
    if (numeros.length <= 12) return numeros.replace(/^(\d{2})(\d{3})(\d{3})(\d+)/, '$1.$2.$3/$4');
    return numeros.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d+)/, '$1.$2.$3/$4-$5');
}

function validarCnpj(cnpj) {
    const digits = (cnpj || '').replace(/\D/g, '');
    if (digits.length !== 14) return false;
    if (/^(\d)\1{13}$/.test(digits)) return false;

    const calc = (base, pesos) => {
        let soma = 0;
        for (let i = 0; i < pesos.length; i++) soma += Number(base[i]) * pesos[i];
        const resto = soma % 11;
        return resto < 2 ? 0 : 11 - resto;
    };

    const d1 = calc(digits, [5,4,3,2,9,8,7,6,5,4,3,2]);
    const d2 = calc(digits, [6,5,4,3,2,9,8,7,6,5,4,3,2]);
    return d1 === Number(digits[12]) && d2 === Number(digits[13]);
}

const inputCnpj = document.getElementById('cnpj_cliente');
if (inputCnpj) {
    inputCnpj.value = aplicarMascaraCnpj(inputCnpj.value);
    inputCnpj.addEventListener('input', function() {
        this.value = aplicarMascaraCnpj(this.value);
        if (this.value.replace(/\D/g, '').length < 14) {
            this.setCustomValidity('Informe um CNPJ válido.');
        } else if (!validarCnpj(this.value)) {
            this.setCustomValidity('CNPJ inválido.');
        } else {
            this.setCustomValidity('');
        }
    });

    inputCnpj.addEventListener('blur', function() {
        if (this.value && !validarCnpj(this.value)) {
            this.setCustomValidity('CNPJ inválido.');
            this.reportValidity();
        } else {
            this.setCustomValidity('');
        }
    });
}
</script>
</body>
</html>
