<?php
if (session_status() === PHP_SESSION_NONE) session_start();

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

$cdorcamentodet = (int)($_GET["cdorcamentodet"] ?? 0);
if ($cdorcamentodet <= 0) {
    echo "<div class='alert alert-danger'>Registro inválido.</div>";
    exit;
}
?>
<!DOCTYPE html>
<html lang="pt-br">

<head>
<meta charset="UTF-8">
<title>Lançamentos da Conta</title>

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>

<style>
html, body {
    width: 100% !important; 
    height: 100% !important;
    margin: 0 !important; 
    padding: 0 !important;
    overflow: hidden !important;
    background: #f5f6f8 !important;
}

body.fullscreen-active .sidebar,
body.fullscreen-active header,
body.fullscreen-active nav,
body.fullscreen-active #layout-menu,
body.fullscreen-active #layout-navbar {
    display: none !important;
}

/* Modais devem sempre estar visíveis e acima de tudo */
.modal {
    position: fixed !important;
    z-index: 10000 !important;
}

.modal-backdrop {
    z-index: 9998 !important;
}

#filho-fullscreen-wrapper {
    width: 100vw !important; 
    height: 100vh !important;
    position: fixed !important;
    top: 0 !important;
    left: 0 !important;
    z-index: 9999 !important;
    overflow-y: auto !important;
    background: #f5f6f8;
}

main, .main, #main, [role="main"] {
    display: none !important;
}

.filho-container { padding: 22px 30px; }

.header-card {
    background: white;
    padding: 25px 35px;
    border-radius: 14px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.05);
    margin-bottom: 20px;
}

.table-wrapper { overflow-x: auto; }

.table-fixed thead th {
    position: sticky; top: 0;
    background: #1f2937; color: white;
    z-index: 50;
    text-align: center;
}

.total-mes-row {
    background: #eef2f6;
    font-weight: 700;
    font-size: 14px;
}
.total-mes-row td {
    text-align: center;
    vertical-align: middle;
    white-space: nowrap;
    padding: 6px 4px;
}

.total-linha {
    font-weight: bold;
    white-space: nowrap;
    font-size: 15px;
}

.col-principal-container {
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.col-principal-top {
    display: flex;
    gap: 6px;
    align-items: center;
}
.col-principal-bottom input {
    padding: 4px 6px;
}

.btn-delete-mini {
    background: none;
    border: none;
    font-size: 20px;
    color: #cc0000;
    cursor: pointer;
}
.btn-three-dots {
    background: none;
    border: none;
    font-size: 20px;
    cursor: pointer;
}

.campo-mes {
    text-align: right;
    white-space: nowrap;
    font-weight: 500;
}

.no-break { white-space: nowrap !important; }

.result-card {
    background: #fafafa;
    padding: 12px 16px;
    border-radius: 10px;
    border: 1px solid #e0e0e0;
    margin-bottom: 10px;
    transition: 0.15s ease;
}
.result-card:hover {
    background: #eaf2ff;
    border-color: #99bfff;
}
</style>

</head>

<body>

<script>
document.body.classList.add("fullscreen-active");
</script>

<div id="filho-fullscreen-wrapper">
<div class="filho-container">

    <div class="header-card d-flex justify-content-between align-items-start">
        <div>
            <h4 class="mb-1">📘 Lançamentos da Conta</h4>
            <small class="text-secondary">
                Exercício: <span id="lblExercicio">--</span> •
                Centro de Custo: <span id="lblCentroCusto">--</span> •
                Moeda: <span id="lblMoeda">--</span><br>
                Conta: <strong><span id="lblConta"></span></strong>
                (<span id="lblCodigoConta"></span>)
            </small>
        </div>

        <button class="btn btn-outline-secondary btn-sm" onclick="voltar()">← Voltar / Salvar</button>
    </div>

    <div class="mb-2 text-start">
        <button class="btn btn-primary btn-sm" onclick="novaLinha()">➕ Inserir Linha</button>
    </div>

    <div class="table-wrapper">
        <table class="table table-bordered table-sm table-fixed" id="tabelaFilhos">

            <thead>
                <tr>
                    <th style="min-width:300px;">Ações / Tipo / Pessoa / Descrição</th>

                    <?php foreach (["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"] as $m): ?>
                        <th class="text-center"><?= $m ?></th>
                    <?php endforeach; ?>

                    <th class="text-center">Total</th>
                </tr>
            </thead>

            <tbody id="tbodyFilhos"></tbody>

        </table>
    </div>

</div>
</div>

<script>

let houveAlteracao = false;

function marcarAlteracao(){
    houveAlteracao = true;
}

window.addEventListener("beforeunload", function (e) {
    if (!houveAlteracao) return;

    const mensagem = "Existem alterações não salvas. Deseja realmente sair?";
    e.preventDefault();
    e.returnValue = mensagem;
    return mensagem;
});

const cdorcamentodet = <?= $cdorcamentodet ?>;
let simboloMoeda = "";
let formatoMoeda = "";
let header = {};
let listaPessoasCache = [];

$(document).ready(() => {
    carregarCabecalho();
    carregarLinhas();
});




/* ======================= CABEÇALHO ======================= */
function carregarCabecalho() {
    fetch(`index.php?m=orcamentodetfilho_actions&ajax=cabecalho&cdorcamentodet=${cdorcamentodet}`)
    .then(r => r.json())
    .then(ret => {
        header = ret;
        simboloMoeda = ret.simbolo;
        formatoMoeda = ret.formato;

        $("#lblExercicio").text(ret.exercicio);
        $("#lblCentroCusto").text(ret.centrocusto);
        $("#lblMoeda").text(ret.simbolo);
        $("#lblConta").text(ret.conta_desc);
        $("#lblCodigoConta").text(ret.conta_cd);
    });
}

/* ======================= LISTAR LINHAS ======================= */
function carregarLinhas() {

    fetch(`index.php?m=orcamentodetfilho_actions&ajax=listar&cdorcamentodet=${cdorcamentodet}`)
    .then(r => r.json())
    .then(lista => {

        let tbody = $("#tbodyFilhos").empty();

        lista.forEach(l => {

            const tr = $("<tr></tr>");

            tr.append(`<td>${colunaPrincipal(l)}</td>`);

            l.meses.forEach((v,i) => {
                tr.append(`
                    <td>
                        <input type="text" 
                               class="form-control form-control-sm campo-mes"
                               data-id="${l.id}" 
                               data-indice="${i}"
                               value="${formatar(v)}">
                    </td>
                `);
            });

            tr.append(`
                <td class="text-end no-break total-linha" id="total_l${l.id}">
                    <strong>${formatar(l.meses.reduce((a,b)=>a+b,0))}</strong>
                </td>
            `);

            tbody.append(tr);
        });

        inserirLinhaTotais();
        aplicarEventosCampos();
    });
}

/* ======================= TOTAL GERAL ======================= */
function inserirLinhaTotais() {

    $("#linhaTotaisMes").remove();

    let totais = Array(12).fill(0);

    document.querySelectorAll("#tbodyFilhos tr").forEach(tr => {
        tr.querySelectorAll(".campo-mes").forEach((c, i) => {
            totais[i] += converterParaNumero(c.value);
        });
    });

    let tabela = document.querySelector("#tabelaFilhos");
    let tr = document.createElement("tr");
    tr.id = "linhaTotaisMes";
    tr.classList.add("total-mes-row");

    tr.appendChild(document.createElement("td"));

    totais.forEach(v => {
        let td = document.createElement("td");
        td.textContent = formatar(v);
        tr.appendChild(td);
    });

    let tdTotal = document.createElement("td");
    tdTotal.innerHTML = "<strong>" + formatar(totais.reduce((a,b)=>a+b,0)) + "</strong>";
    tr.appendChild(tdTotal);

    tabela.tBodies[0].prepend(tr);
}

/* ==========================================================
   COLUNA PRINCIPAL — COM LUPA + PESSOA
========================================================== */
function colunaPrincipal(l){

    const inicial = (l.pessoa_nome ?? "").trim() !== ""
        ? l.pessoa_nome.trim().substring(0,1).toUpperCase()
        : "?";

    let pessoa = "";

    if (l.dsorigem === "CONTRATO"){
        pessoa = `
            <div class="d-flex align-items-center gap-2" style="min-width:190px;">

                <button class="btn btn-light border btn-sm"
                        style="padding:2px 6px;"
                        onclick="buscarPessoa(${l.id})">
                    🔍
                </button>

                <div id="pessoaInicial_${l.id}"
                     class="rounded-circle bg-primary text-white d-flex justify-content-center align-items-center"
                     style="width:26px;height:26px;">
                     ${inicial}
                </div>

                <span class="fw-semibold text-primary"
                      id="pessoaNome_${l.id}">
                    ${l.pessoa_nome ?? ""}
                </span>

            </div>
        `;
    }

    return `
        <div class="col-principal-container">

            <div class="col-principal-top">
                <button class="btn-delete-mini" onclick="confirmarExclusao(${l.id}, this)">🗑️</button>
                <button class="btn-three-dots" onclick="abrirAutomacao(${l.id})">⋮</button>
                <button class="btn-three-dots" onclick="duplicarLinha(${l.id})">⧉</button>

                <select class="form-select form-select-sm"
                        style="max-width:130px;"
                        onchange="marcarAlteracao(); trocarTipo(${l.id}, this.value)">
                    <option value="MANUAL"      ${l.dsorigem==="MANUAL"?"selected":""}>Manual</option>
                    <option value="IMPORTACAO"  ${l.dsorigem==="IMPORTACAO"?"selected":""}>Importação</option>
                    <option value="CONTRATO"    ${l.dsorigem==="CONTRATO"?"selected":""}>Contrato</option>
                </select>

                <div id="areaPessoa_${l.id}" class="ms-2">${pessoa}</div>

                <button class="btn btn-sm btn-light border"
                        data-bs-toggle="tooltip"
                        data-bs-placement="top"
                        title="${(l.dsobs ?? "").replace(/"/g,'&quot;')}"
                        onclick="abrirEditorObs(${l.id}, '${String(l.dsobs ?? "").replace(/'/g,"\\'")}')">
                    ⓘ
                </button>
            </div>

            <div class="col-principal-bottom">
                <input type="text"
                       id="desc_${l.id}"
                       class="form-control form-control-sm input-desc"
                       placeholder="Descrição..."
                       value="${l.descricao ?? ""}"
                       oninput="marcarAlteracao()"
                       onblur="salvarDescricao(${l.id})">
            </div>

        </div>
    `;
}
/* ==========================================================
   BUSCAR PESSOA — MODAL INTERNO
========================================================== */
function buscarPessoa(id){

    window.pessoaSelecionada = function(codigo, nome){

        marcarAlteracao();

        fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_campo",{
            method:"POST",
            headers:{"Content-Type":"application/x-www-form-urlencoded"},
            body:new URLSearchParams({id, campo:"cdpessoa", valor:codigo})
        }).then(() => {

            document.querySelector(`#pessoaNome_${id}`).innerText = nome;
            document.querySelector(`#pessoaInicial_${id}`).innerText = nome.substring(0,1).toUpperCase();

            const modal = bootstrap.Modal.getInstance(document.getElementById("modalPessoa"));
            if (modal) modal.hide();
        });
    };

    let modal = new bootstrap.Modal(document.getElementById("modalPessoa"));
    modal.show();

    const inputBusca = document.getElementById("buscaPessoa");
    const divLista   = document.getElementById("listaPessoasModal");

    if (inputBusca) inputBusca.value = "";
    if (divLista) divLista.innerHTML = `<div class="text-center text-secondary p-3">Carregando...</div>`;

    fetch("index.php?m=orcamentodetfilho_actions&ajax=listar_pessoas")
        .then(r => r.json())
        .then(lista => {
            listaPessoasCache = lista || [];
            renderizarListaPessoas(listaPessoasCache.slice(0, 10));
        });
}

/* ==========================================================
   LISTAGEM VISUAL DA PESSOA NO MODAL
========================================================== */
function renderizarListaPessoas(lista){
    const div = document.getElementById("listaPessoasModal");
    if (!div) return;

    div.innerHTML = "";

    if (!lista || lista.length === 0) {
        div.innerHTML = `<div class="text-muted">Nenhum resultado encontrado.</div>`;
        return;
    }

    lista.slice(0,10).forEach(p => {

        let card = document.createElement("div");
        card.className = "result-card d-flex justify-content-between align-items-center";
        card.style.cursor = "pointer";

        card.onclick = () => selecionarPessoaModal(p.id, p.nome);

        card.innerHTML = `
            <div>
                <strong>${p.nome}</strong><br>
                <small>Documento: ${p.documento || "--"}</small><br>
                <small>Telefone: ${p.telefone || "--"}</small><br>
                <small>Cidade: ${p.cidade || "--"}</small>
            </div>
            <button class="btn btn-primary btn-sm">Selecionar</button>
        `;

        div.appendChild(card);
    });
}

/* ==========================================================
   FILTRO POR NOME / DOCUMENTO / TELEFONE — MAX 10 RESULTADOS
========================================================== */
function filtrarPessoasModal(){
    const termoInput = document.getElementById("buscaPessoa");
    if (!termoInput) return;

    const termoBruto = termoInput.value.trim().toLowerCase();
    const termoNum   = termoBruto.replace(/\D/g, "");

    if (!termoBruto){
        renderizarListaPessoas(listaPessoasCache.slice(0, 10));
        return;
    }

    const filtrado = listaPessoasCache.filter(p => {
        const nome   = (p.nome || "").toLowerCase();
        const docNum = (p.documento || "").replace(/\D/g, "");
        const telNum = (p.telefone || "").replace(/\D/g, "");

        const matchNome = termoBruto && nome.includes(termoBruto);
        const matchDoc  = termoNum && docNum.includes(termoNum);
        const matchTel  = termoNum && telNum.includes(termoNum);

        return matchNome || matchDoc || matchTel;
    });

    renderizarListaPessoas(filtrado.slice(0, 10));
}

function selecionarPessoaModal(cdpessoa, nome){
    if (window.pessoaSelecionada){
        window.pessoaSelecionada(cdpessoa, nome);
    }
}

/* ==========================================================
   TROCAR TIPO — MOSTRA/ESCONDE ÁREA DA PESSOA
========================================================== */
function trocarTipo(id, novoTipo){

    marcarAlteracao();

    fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_campo",{
        method:"POST",
        headers:{"Content-Type":"application/x-www-form-urlencoded"},
        body:new URLSearchParams({id, campo:"dsorigem", valor:novoTipo})
    });

    if (novoTipo === "MANUAL"){

        fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_campo",{
            method:"POST",
            headers:{"Content-Type":"application/x-www-form-urlencoded"},
            body:new URLSearchParams({id, campo:"cdpessoa", valor:"", limparPessoa:"1"})
        });

        document.querySelector(`#areaPessoa_${id}`).innerHTML = "";
        return;
    }

    if (novoTipo === "CONTRATO"){

        document.querySelector(`#areaPessoa_${id}`).innerHTML = `
            <div class="d-flex align-items-center gap-2" style="min-width:190px;">

                <button class="btn btn-light border btn-sm"
                        style="padding:2px 6px;"
                        onclick="buscarPessoa(${id})">🔍</button>

                <div id="pessoaInicial_${id}"
                     class="rounded-circle bg-primary text-white d-flex justify-content-center align-items-center"
                     style="width:26px;height:26px;">?</div>

                <span class="fw-semibold text-primary"
                      id="pessoaNome_${id}"></span>
            </div>
        `;
    }
}

/* ==========================================================
   MODAL DE OBSERVAÇÃO
========================================================== */
let obsIdEdicao = null;

function abrirEditorObs(id, texto){

    obsIdEdicao = id;
    document.getElementById("obsTexto").value = texto;

    let modal = new bootstrap.Modal(document.getElementById("modalObs"));
    modal.show();
}

function salvarDescricao(id){
    marcarAlteracao();

    const valor = document.querySelector(`#desc_${id}`).value.trim();

    fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_campo", {
        method: "POST",
        headers: { "Content-Type": "application/x-www-form-urlencoded" },
        body: new URLSearchParams({
            id,
            campo: "descricao",
            valor: valor
        })
    });
}

function salvarObs(){

    const texto = document.getElementById("obsTexto").value.trim();

    marcarAlteracao();

    fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_campo", {
        method: "POST",
        headers: {"Content-Type":"application/x-www-form-urlencoded"},
        body: new URLSearchParams({
            id: obsIdEdicao,
            campo:"dsobs",
            valor: texto
        })
    }).then(() => {

        obsIdEdicao = null;

        carregarLinhas();

        bootstrap.Modal.getInstance(document.getElementById("modalObs")).hide();
    });
}

/* ==========================================================
   DUPLICAR LINHA
========================================================== */
function duplicarLinha(idOriginal) {

    marcarAlteracao();

    const linha = document.querySelector(`input[data-id="${idOriginal}"]`)?.closest("tr");
    if (!linha) return;

    const campos = linha.querySelectorAll(".campo-mes");

    let meses = [];
    campos.forEach(c => meses.push(converterParaNumero(c.value)));

    const tipo = linha.querySelector("select")?.value;
    const descricao = linha.querySelector(".input-desc")?.value;

    const pessoaNome = linha.querySelector("[id^=pessoaNome_]")?.innerText.trim();
    const pessoaId = pessoaNome ? linha.querySelector("[id^=pessoaNome_]")?.id.split("_")[1] : null;

    fetch("index.php?m=orcamentodetfilho_actions&ajax=criar_linha", {
        method: "POST",
        headers: {"Content-Type":"application/x-www-form-urlencoded"},
        body: new URLSearchParams({cdorcamentodet})
    })
    .then(r => r.json())
    .then(ret => {

        if (!ret.ok) {
            alert("Erro ao duplicar linha.");
            return;
        }

        const novoId = ret.id;

        fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_campo", {
            method: "POST",
            headers: {"Content-Type":"application/x-www-form-urlencoded"},
            body: new URLSearchParams({id: novoId, campo:"dsorigem", valor:tipo})
        });

        fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_campo", {
            method: "POST",
            headers: {"Content-Type":"application/x-www-form-urlencoded"},
            body: new URLSearchParams({id: novoId, campo:"descricao", valor:descricao})
        });

        if (tipo === "CONTRATO" && pessoaId) {
            fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_campo", {
                method: "POST",
                headers: {"Content-Type":"application/x-www-form-urlencoded"},
                body: new URLSearchParams({id: novoId, campo:"cdpessoa", valor:pessoaId})
            });
        }

        meses.forEach((v, i) => {
            fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_mes", {
                method: "POST",
                headers: {"Content-Type":"application/x-www-form-urlencoded"},
                body: new URLSearchParams({id: novoId, indice:i, valor:v})
            });
        });

        carregarLinhas();
    });
}

/* ---- FUNÇÃO DE MÁSCARA PARA autoReceitaManual ---- */
function aplicarMascaraAutoReceitaManual() {

    const campo = document.getElementById("autoReceitaManual");
    if (!campo) return;

    campo.addEventListener("input", () => {

        let val = campo.value.replace(simboloMoeda, "").trim();

        // deixa só número e vírgula
        val = val.replace(/[^\d,]/g, "");

        // detecta se usuário digitou vírgula
        const temVirgula = val.includes(",");

        // separa inteiro e decimal
        let partes  = val.split(",");
        let inteiro = (partes[0] || "").replace(/\D/g, "");
        let decimal = (partes[1] || "").replace(/\D/g, "");

        // se moeda for inteira, ignora decimal e vírgula
        if (formatoMoeda === "inteiro") {
            decimal = "";
        } else {
            decimal = decimal.substring(0, 2);
        }

        // aplica milhar no inteiro
        if (inteiro.length > 0) {
            inteiro = Number(inteiro).toLocaleString("pt-BR");
        }

        // monta preservando a vírgula mesmo sem decimal
        campo.value = (temVirgula && formatoMoeda !== "inteiro")
            ? inteiro + "," + decimal
            : inteiro;
    });
}


/* ---- FUNÇÃO DE MÁSCARA aceitando virgula---- */

function aplicarMascaraDigitacaoMoeda(campo){

    campo.addEventListener("input", () => {

        let valor = campo.value.replace(simboloMoeda, "").trim();

        // permite apenas números e vírgula
        valor = valor.replace(/[^\d,]/g, "");

        // separa inteiro e decimal
        let partes = valor.split(",");
        let inteiro = partes[0];
        let decimal = partes[1] ?? "";

        // moeda inteira → ignora decimal
        if (formatoMoeda === "inteiro") {
            decimal = "";
        }

        // limita decimal a 2 casas
        decimal = decimal.substring(0, 2);

        // aplica milhar SOMENTE no inteiro
        inteiro = inteiro.replace(/\D/g, "");
        if (inteiro) {
            inteiro = Number(inteiro).toLocaleString("pt-BR");
        }

        // monta valor final
        campo.value =
            decimal !== ""
                ? inteiro + "," + decimal
                : inteiro;
    });
}


/* ==========================================================
   AUTOMAÇÃO - MODAL E AÇÕES
========================================================== */

let linhaAutomacaoId = null;
let autoValorRepetirMascaraAplicada = false; // <- flag só pra não duplicar listener
let autoValorReceitaManualMascaraAplicada = false; 

function abrirAutomacao(idLinha) {
    linhaAutomacaoId = idLinha;

    // limpa campos do modal
    document.getElementById("autoValorRepetir").value = "";
    document.getElementById("autoPercentualAnterior").value = "0";
    document.getElementById("autoPercentualReceita").value = "";
    document.getElementById("autoReceitaManual").value = "";

    let modal = new bootstrap.Modal(document.getElementById("modalAutomacao"));
    modal.show();

    // aplica máscara no campo "Repetir valor" (mesma lógica dos meses)
    if (!autoValorRepetirMascaraAplicada) {
        aplicarMascaraAutoValorRepetir();
        autoValorRepetirMascaraAplicada = true;
    }
	
	if (!autoValorReceitaManualMascaraAplicada) {
    aplicarMascaraAutoReceitaManual();
    autoValorReceitaManualMascaraAplicada = true;
	}

    // buscar pcideal da conta e preencher o campo de percentual, se vier algo
    fetch(`index.php?m=orcamentodetfilho_actions&ajax=pcideal_da_conta&id=${idLinha}`)
        .then(r => r.json())
        .then(ret => {
            if (ret.ok && ret.pcideal !== null && ret.pcideal !== undefined) {
                const campoPerc = document.getElementById("autoPercentualReceita");
                if (campoPerc && !campoPerc.value.trim()) {
                    // converte 12.5 -> "12,5"
                    let valor = String(ret.pcideal).replace(".", ",");
                    campoPerc.value = valor;
                }
            }
        })
        .catch(() => {
            // silencioso, não quebra o modal se der erro
        });
}

/* ---- FUNÇÃO DE MÁSCARA PARA autoValorRepetir (igual aos meses) ---- */
function aplicarMascaraAutoValorRepetir() {

    const campo = document.getElementById("autoValorRepetir");
    if (!campo) return;

    campo.addEventListener("input", () => {

        let val = campo.value.replace(simboloMoeda, "").trim();

        // deixa só número e vírgula
        val = val.replace(/[^\d,]/g, "");

        // detecta se usuário digitou vírgula
        const temVirgula = val.includes(",");

        // separa inteiro e decimal
        let partes  = val.split(",");
        let inteiro = (partes[0] || "").replace(/\D/g, "");
        let decimal = (partes[1] || "").replace(/\D/g, "");

        // se moeda for inteira, ignora decimal e vírgula
        if (formatoMoeda === "inteiro") {
            decimal = "";
        } else {
            decimal = decimal.substring(0, 2);
        }

        // aplica milhar no inteiro
        if (inteiro.length > 0) {
            inteiro = Number(inteiro).toLocaleString("pt-BR");
        }

        // monta preservando a vírgula mesmo sem decimal
        campo.value = (temVirgula && formatoMoeda !== "inteiro")
            ? inteiro + "," + decimal
            : inteiro;
    });
}

/* ---- 1) Repetir um valor em todos os meses ---- */
function autoAplicarRepetir() {
    if (!linhaAutomacaoId) return;

    const valorStr = document.getElementById("autoValorRepetir").value.trim();
    if (!valorStr) {
        alert("Informe um valor para repetir.");
        return;
    }

    const valor = valorStr.replace(/\./g, "").replace(",", ".");

    fetch("index.php?m=orcamentodetfilho_actions&ajax=automacao", {
        method: "POST",
        headers: {"Content-Type": "application/x-www-form-urlencoded"},
        body: new URLSearchParams({
            id: linhaAutomacaoId,
            tipo: "repetir",
            valor: valor
        })
    })
    .then(r => r.json())
    .then(ret => {
        if (!ret.ok) {
            alert(ret.msg || "Erro ao aplicar automação.");
            return;
        }
        bootstrap.Modal.getInstance(document.getElementById("modalAutomacao")).hide();
        carregarLinhas();
    });
}
/* ---- 2) Zerar todos os meses ---- */
function autoAplicarZerar() {
    if (!linhaAutomacaoId) return;

    if (!confirm("Deseja realmente zerar todos os meses desta linha?")) return;

    fetch("index.php?m=orcamentodetfilho_actions&ajax=automacao", {
        method: "POST",
        headers: {"Content-Type": "application/x-www-form-urlencoded"},
        body: new URLSearchParams({
            id: linhaAutomacaoId,
            tipo: "zerar"
        })
    })
    .then(r => r.json())
    .then(ret => {
        if (!ret.ok) {
            alert(ret.msg || "Erro ao aplicar automação.");
            return;
        }
        bootstrap.Modal.getInstance(document.getElementById("modalAutomacao")).hide();
        carregarLinhas();
    });
}

/* ---- 3) Percentual sobre ano anterior (ORÇADO ou REALIZADO) ---- */
function autoAplicarPercentualAnterior(base) {
    if (!linhaAutomacaoId) return;

    const percStr = document.getElementById("autoPercentualAnterior").value.trim();
    const perc = parseFloat(percStr.replace(",", ".") || "0");

    if (isNaN(perc)) {
        alert("Informe um percentual válido.");
        return;
    }

    fetch("index.php?m=orcamentodetfilho_actions&ajax=automacao", {
        method: "POST",
        headers: {"Content-Type": "application/x-www-form-urlencoded"},
        body: new URLSearchParams({
            id: linhaAutomacaoId,
            tipo: "percentual_anterior",
            base: base,
            percentual: perc
        })
    })
    .then(r => r.json())
    .then(ret => {
        if (!ret.ok) {
            alert(ret.msg || "Erro ao aplicar automação.");
            return;
        }
        bootstrap.Modal.getInstance(document.getElementById("modalAutomacao")).hide();
        carregarLinhas();
    });
}

/* ---- 4) Cálculo com base na RECEITA (PC IDEAL) ---- */
function autoAplicarReceitaPcIdeal(natureza) {
    if (!linhaAutomacaoId) return;

    const percStr = document.getElementById("autoPercentualReceita").value.trim();
    const percManual = percStr ? parseFloat(percStr.replace(",", ".")) : null;

    const receitaStr = document.getElementById("autoReceitaManual").value.trim();
    const receitaManual = receitaStr ? parseFloat(receitaStr.replace(/\./g, "").replace(",", ".")) : null;

    fetch("index.php?m=orcamentodetfilho_actions&ajax=automacao", {
        method: "POST",
        headers: {"Content-Type": "application/x-www-form-urlencoded"},
        body: new URLSearchParams({
            id: linhaAutomacaoId,
            tipo: "pcideal_receita",
            natureza: natureza, // <--- C ou D
            percentual_manual: percManual !== null ? percManual : "",
            receita_manual: receitaManual !== null ? receitaManual : ""
        })
    })
    .then(r => r.json())
    .then(ret => {

        if (!ret.ok) {
            if (ret.codigo === "SEM_RECEITA_BASE") {
                alert(
                    "Nenhuma base encontrada para esta natureza.\n" +
                    "Informe o valor manual e aplique novamente."
                );
                return;
            }

            alert(ret.msg || "Erro ao aplicar automação.");
            return;
        }

        bootstrap.Modal.getInstance(document.getElementById("modalAutomacao")).hide();
        carregarLinhas();
    });
}

/* ==========================================================
   MÁSCARAS E TOTALIZAÇÃO
========================================================== */
function aplicarEventosCampos(){

    document.querySelectorAll(".campo-mes").forEach(campo => {

        campo.addEventListener("input", () => {

            marcarAlteracao();

            // valor bruto sem símbolo
            let val = campo.value.replace(simboloMoeda, "").trim();

            // permite apenas números e vírgula
            val = val.replace(/[^\d,]/g, "");

            // detecta se o usuário digitou vírgula (mesmo sem decimal)
            const digitouVirgula = val.indexOf(",") !== -1;

            // separa inteiro e decimal
            let partes  = val.split(",");
            let inteiro = partes[0] ?? "";
            let decimal = partes[1] ?? "";

            // limpa partes
            inteiro = inteiro.replace(/\D/g, "");
            decimal = decimal.replace(/\D/g, "");

            // regra para moeda inteira
            if (formatoMoeda === "inteiro") {
                decimal = "";
            } else {
                decimal = decimal.substring(0, 2);
            }

            // aplica milhar SOMENTE no inteiro
            if (inteiro.length > 0) {
                inteiro = Number(inteiro).toLocaleString("pt-BR");
            }

            // 🔑 REGRA FINAL (ESSENCIAL)
            // mantém a vírgula mesmo sem decimal se o usuário digitou
            if (digitouVirgula && formatoMoeda !== "inteiro") {
                campo.value = inteiro + "," + decimal;
            } else {
                campo.value = inteiro;
            }

            atualizarTotaisLinha(campo.dataset.id);
            inserirLinhaTotais();
        });

        campo.addEventListener("focus", () => {
            setTimeout(() => campo.select(), 40);
        });

        campo.addEventListener("keydown", function(e){
            if (e.key === "Enter"){
                e.preventDefault();
                focarProximoCampo(campo);
            }
            if (e.shiftKey && e.key === "Tab"){
                e.preventDefault();
                focarAnteriorCampo(campo);
            }
        });

        campo.addEventListener("blur", () => {

            marcarAlteracao();

            const id     = campo.dataset.id;
            const indice = campo.dataset.indice;
            const valor  = converterParaNumero(campo.value);

            atualizarMes(id, indice, valor);

            // formata definitivamente ao sair do campo
            campo.value = formatar(valor);

            atualizarTotaisLinha(id);
            inserirLinhaTotais();
        });

    });
}


function atualizarTotaisLinha(id){

    let total = 0;

    document.querySelectorAll(`input[data-id="${id}"]`).forEach(c => {
        total += converterParaNumero(c.value);
    });

    document.querySelector(`#total_l${id}`).innerHTML =
        "<strong>" + formatar(total) + "</strong>";
}

function focarProximoCampo(c){
    let lista = [...document.querySelectorAll(".campo-mes")];
    let i = lista.indexOf(c);
    if (i < lista.length-1) lista[i+1].focus();
}

function focarAnteriorCampo(c){
    let lista = [...document.querySelectorAll(".campo-mes")];
    let i = lista.indexOf(c);
    if (i > 0) lista[i-1].focus();
}

/* ==========================================================
   UPDATE MÊS
========================================================== */
function atualizarMes(id,indice,valor){
    fetch("index.php?m=orcamentodetfilho_actions&ajax=atualizar_mes",{
        method:"POST",
        headers:{"Content-Type":"application/x-www-form-urlencoded"},
        body:new URLSearchParams({id,indice,valor})
    });
}

/* ==========================================================
   FORMATOS
========================================================== */
function converterParaNumero(v){
    if (!v) return 0;
    v = v.replace(simboloMoeda,"").trim();
    v = v.replace(/\./g,"").replace(",",".");
    return parseFloat(v)||0;
}

function formatar(v){
    if (isNaN(v)) return simboloMoeda+" 0,00";

    if (formatoMoeda === "inteiro")
        return simboloMoeda+" "+Number(v).toLocaleString("pt-BR",{minimumFractionDigits:0});

    return simboloMoeda+" "+Number(v).toLocaleString("pt-BR",{minimumFractionDigits:2});
}

/* ==========================================================
   VALIDAR ANTES DE SAIR
========================================================== */
function validarAntesDeSair(){

    let erros = [];

    const linhas = [...document.querySelectorAll("#tbodyFilhos tr:not(#linhaTotaisMes)")];

    for (let i=0;i<linhas.length;i++){

        const tr = linhas[i];
        const linhaNumero = i+1;

        const desc = tr.querySelector(".input-desc")?.value.trim();
        const tipo = tr.querySelector("select")?.value;
        const pessoa = tr.querySelector("[id^=pessoaNome_]")?.innerText.trim();

        if (!desc)
            erros.push(`Linha ${linhaNumero}: descrição obrigatória.`);

        if (tipo === "CONTRATO" && !pessoa){
            erros.push(`Linha ${linhaNumero}: contrato exige selecionar pessoa.`);
        }
    }

    if (erros.length){
        alert("⚠ Há pendências:\n\n" + erros.join("\n"));
        return false;
    }

    return true;
}

/* ==========================================================
   EXCLUSÃO
========================================================== */
function confirmarExclusao(id, botao){
    marcarAlteracao();

    let td = botao.parentElement.parentElement;
    td.innerHTML = `
        <div class="text-danger fw-bold">Excluir?</div>
        <button class="btn btn-sm btn-secondary" onclick="carregarLinhas()">Cancelar</button>
        <button class="btn btn-sm btn-danger" onclick="excluir(${id})">Excluir</button>
    `;
}

function excluir(id){
    marcarAlteracao();

    fetch("index.php?m=orcamentodetfilho_actions&ajax=excluir",{
        method:"POST",
        headers:{"Content-Type":"application/x-www-form-urlencoded"},
        body:new URLSearchParams({id})
    }).then(()=>{
        carregarLinhas();
    });
}

/* ==========================================================
   VOLTAR
========================================================== */
function voltar(){

    if (!validarAntesDeSair()) return;

    houveAlteracao = false;
   
    fetch("index.php?m=orcamentodetfilho_actions&ajax=recalcular",{
        method:"POST",
        headers:{"Content-Type":"application/x-www-form-urlencoded"},
        body:"id="+cdorcamentodet
    }).then(()=>{
        window.location.href =
            `index.php?m=orcamentodet&cdorcamento=${header.cdorcamento}&expand=${header.cdcontacontabil}`;
    });
}

/* ==========================================================
   NOVA LINHA
========================================================== */
function novaLinha(){

    marcarAlteracao();

    fetch("index.php?m=orcamentodetfilho_actions&ajax=criar_linha",{
        method:"POST",
        headers:{"Content-Type":"application/x-www-form-urlencoded"},
        body:new URLSearchParams({cdorcamentodet})
    })
    .then(r => r.json())
    .then(ret => {
        if (ret.ok){
            carregarLinhas();
        } else {
            alert("Não foi possível criar a linha.");
        }
    });
}

</script>

<!-- =====================================================
     MODAL DE OBSERVAÇÃO
===================================================== -->
<div class="modal fade" id="modalObs" tabindex="-1">
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">

      <div class="modal-header">
        <h5 class="modal-title">Observação</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>

      <div class="modal-body">
        <textarea id="obsTexto" class="form-control" rows="4"></textarea>
      </div>

      <div class="modal-footer">
        <button class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
        <button class="btn btn-primary" onclick="salvarObs()">Salvar</button>
      </div>

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

<!-- =====================================================
     MODAL DE BUSCA DE PESSOA
===================================================== -->
<div class="modal fade" id="modalPessoa" tabindex="-1">
  <div class="modal-dialog modal-lg modal-dialog-centered">
    <div class="modal-content">

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

      <div class="modal-body">

        <input type="text"
               id="buscaPessoa"
               class="form-control mb-3"
               placeholder="Digite nome, documento ou telefone..."
               oninput="filtrarPessoasModal()">

        <div id="listaPessoasModal" style="max-height:400px; overflow-y:auto;">
            <div class="text-center text-secondary p-3">Carregando...</div>
        </div>

      </div>

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


<!-- =====================================================
     MODAL DE AUTOMAÇÃO DA LINHA
===================================================== -->
<div class="modal fade" id="modalAutomacao" tabindex="-1">
  <div class="modal-dialog modal-lg modal-dialog-centered">
    <div class="modal-content">

      <div class="modal-header">
        <h5 class="modal-title">Automação da Linha</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>

      <div class="modal-body">

        <!-- 1) Repetir valor -->
        <div class="mb-3 border rounded p-3">
          <h6 class="mb-2">Repetir um valor em todos os meses</h6>
          <div class="input-group">
            <span class="input-group-text">Valor</span>
            <input type="text" id="autoValorRepetir" class="form-control" placeholder="Ex: 1.000,00">
            <button class="btn btn-primary" type="button" onclick="autoAplicarRepetir()">Aplicar</button>
          </div>
        </div>

        <!-- 2) Zerar meses -->
        <div class="mb-3 border rounded p-3">
          <h6 class="mb-2">Zerar todos os meses</h6>
          <button class="btn btn-outline-danger btn-sm" type="button" onclick="autoAplicarZerar()">
            Zerar linha
          </button>
        </div>

        <!-- 3) Percentual sobre ano anterior -->
        <div class="mb-3 border rounded p-3">
          <h6 class="mb-2">Calcular com base no ano anterior</h6>

          <div class="row g-2 align-items-end">
            <div class="col-md-4">
              <label class="form-label mb-1">Percentual (%)</label>
              <input type="text" id="autoPercentualAnterior" class="form-control" value="0">
            </div>
            <div class="col-md-8">
              <label class="form-label mb-1">Base</label><br>
              <button class="btn btn-outline-secondary btn-sm me-2" type="button"
                      onclick="autoAplicarPercentualAnterior('orcado')">
                Sobre ORÇADO do ano anterior
              </button>
              <button class="btn btn-outline-secondary btn-sm" type="button"
                      onclick="autoAplicarPercentualAnterior('realizado')">
                Sobre REALIZADO do ano anterior
              </button>
            </div>
          </div>
        </div>
<!-- 4) Cálculo pela RECEITA (PC IDEAL) -->
<div class="mb-1 border rounded p-3">
  <h6 class="mb-2">Calcular por % Ideal</h6>

  <small class="text-muted d-block mb-2">
      Usa o percentual ideal da conta no plano contábil em relação à conta matriz.
      Você pode aplicar tanto pela RECEITA (Crédito) quanto pela DESPESA (Débito).
  </small>

  <div class="row g-2">
    <div class="col-md-4">
      <label class="form-label mb-1">Percentual(%) <small class="text-muted">(opcional)</small></label>
      <input type="text" id="autoPercentualReceita" class="form-control"
             placeholder="Padrão o Default da Conta">
    </div>

    <div class="col-md-4">
      <label class="form-label mb-1">Valor base manual <small class="text-muted">(opcional)</small></label>
      <input type="text" id="autoReceitaManual" class="form-control"
             placeholder="Ex: 500.000,00">
    </div>

    <div class="col-md-4 d-flex flex-column gap-2">

      <button class="btn btn-outline-primary"
              type="button"
              onclick="autoAplicarReceitaPcIdeal('C')">
        Aplicar Pela Receita Matriz
      </button>

      <button class="btn btn-outline-warning"
              type="button"
              onclick="autoAplicarReceitaPcIdeal('D')">
        Aplicar Pela Despesa Matriz
      </button>

    </div>
  </div>

</div>


      </div>

      <div class="modal-footer">
        <button class="btn btn-secondary" data-bs-dismiss="modal">Fechar</button>
      </div>

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

</body>
</html>
