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

/*
 |=====================
 | HANDLERS AJAX PRIMEIRO
 |=====================
*/
if (isset($_GET['ajax']) && $_GET['ajax'] === 'salvar') {
    header('Content-Type: application/json; charset=UTF-8');
    try {
        $input = json_decode(file_get_contents('php://input'), true);
        if (!$input) throw new Exception('Payload inválido.');
        $cdexercicio = (int)($input['cdexercicio'] ?? 0);
        $dados = $input['dados'] ?? [];
        if (!$cdexercicio || !is_array($dados) || count($dados) === 0) {
            throw new Exception('Nada para atualizar.');
        }

        // Atualiza somente alterações
        $upd = $pdo->prepare("
            UPDATE back.cotacao
               SET fator = :f
             WHERE cdexercicio = :ex
               AND cdmoedaorigem = :o_id
               AND cdmoedadestino = :d_id
               AND COALESCE(mesref, 0) = :m
        ");

        $qtd = 0;
        foreach ($dados as $d) {
            $o_id = (int)$d['origem_id'];
            $d_id = (int)$d['destino_id'];
            $mes  = (int)$d['mes']; // 1..12 ou 0 para anual
            $fator = (float)$d['fator'];

            $upd->execute([
                ':f'  => $fator,
                ':ex' => $cdexercicio,
                ':o_id' => $o_id,
                ':d_id' => $d_id,
                ':m'  => $mes
            ]);
            $qtd += $upd->rowCount(); // conta só o que realmente mudou
        }

        echo json_encode(['ok' => true, 'msg' => "💾 Cotação atualizada com sucesso! ($qtd mudanças)"]);
    } catch (Exception $e) {
        echo json_encode(['ok' => false, 'msg' => '⚠️ '.$e->getMessage()]);
    }
    exit;
}

/*
 |=====================
 | DADOS BASE P/ EDIÇÃO
 |=====================
*/
$id = (int)($_GET['id'] ?? 0);
if (!$id) {
    echo "<script>alert('Exercício não informado.'); window.location='?m=cotacao';</script>";
    exit;
}

$exercicio = $pdo->prepare("
    SELECT cdexercicio, anoref, descricao, floficial
      FROM back.exercicio
     WHERE cdexercicio = :id
");
$exercicio->execute([':id' => $id]);
$ex = $exercicio->fetch(PDO::FETCH_ASSOC);
if (!$ex) {
    echo "<script>alert('Exercício não encontrado.'); window.location='?m=cotacao';</script>";
    exit;
}

// Se for oficial, modo somente leitura
$somenteLeitura = ($ex['floficial'] == 1);

$cotacoes = $pdo->prepare("
    SELECT c.cdmoedaorigem, c.cdmoedadestino, 
           m1.dsmoeda AS moedaorigem, m2.dsmoeda AS moedadestino,
           m2.formato AS formatodestino,
           c.fator, c.mesref, c.flmensal
      FROM back.cotacao c
      JOIN back.moeda m1 ON m1.cdmoeda = c.cdmoedaorigem
      JOIN back.moeda m2 ON m2.cdmoeda = c.cdmoedadestino
     WHERE c.cdexercicio = :id
  ORDER BY moedaorigem, moedadestino, mesref
");
$cotacoes->execute([':id' => $id]);
$dados = $cotacoes->fetchAll(PDO::FETCH_ASSOC);

if (!$dados) {
    echo "<script>alert('Nenhuma cotação encontrada.'); window.location='?m=cotacao';</script>";
    exit;
}

$flmensal = (bool)$dados[0]['flmensal'];

// Monta matriz: uma linha por par origem->destino
$matriz = [];
foreach ($dados as $c) {
    $key = $c['cdmoedaorigem'] . '-' . $c['cdmoedadestino'];
    if (!isset($matriz[$key])) {
        $matriz[$key] = [
            'origem'   => $c['moedaorigem'],
            'destino'  => $c['moedadestino'],
            'origem_id'=> (int)$c['cdmoedaorigem'],
            'destino_id'=>(int)$c['cdmoedadestino'],
            'formatodestino' => $c['formatodestino'],
            'fatores'  => array_fill(1, 12, null)
        ];
    }
    if ($flmensal) {
        $matriz[$key]['fatores'][(int)$c['mesref']] = (float)$c['fator'];
    } else {
        $matriz[$key]['fatores'][1] = (float)$c['fator']; // anual
    }
}
?>
<h4 class="mb-3"><i class="bi bi-pencil"></i> <?= $somenteLeitura ? 'Visualizar' : 'Editar' ?> Cotação</h4>
<hr>

<div class="alert <?= $somenteLeitura ? 'alert-warning' : 'alert-info' ?> py-2">
  <b>Exercício:</b> <?= htmlspecialchars($ex['anoref'] . ' - ' . $ex['descricao']) ?> |
  <b>Tipo:</b> <?= $flmensal ? 'Mensal' : 'Anual' ?>
  <?php if ($somenteLeitura): ?>
    <br><b>Aviso:</b> Este exercício é <span class="text-danger">oficial</span>, portanto a edição de cotações está desabilitada.
  <?php endif; ?>
</div>

<form id="formEditar">
  <input type="hidden" name="cdexercicio" value="<?= $id ?>">

  <table class="table table-striped table-bordered align-middle text-center">
    <thead class="table-dark">
      <tr>
        <th>Moeda Origem</th>
        <th>Moeda Destino</th>
        <?php if ($flmensal): ?>
          <?php foreach (['JAN','FEV','MAR','ABR','MAI','JUN','JUL','AGO','SET','OUT','NOV','DEZ'] as $m): ?>
            <th><?= $m ?></th>
          <?php endforeach; ?>
        <?php else: ?>
          <th>Fator Anual</th>
        <?php endif; ?>
      </tr>
    </thead>
    <tbody>
      <?php foreach ($matriz as $item): ?>
        <tr>
          <td><?= htmlspecialchars($item['origem']) ?></td>
          <td><?= htmlspecialchars($item['destino']) ?></td>
          <?php if ($flmensal): ?>
            <?php for ($mes = 1; $mes <= 12; $mes++): 
                $valor = $item['fatores'][$mes];
                $fmt   = $item['formatodestino'];
                $mask  = ($valor === null) ? '' : (
                  $fmt === 'inteiro'
                    ? number_format($valor, 0, ',', '.')
                    : number_format($valor, 2, ',', '.')
                );
                $original = ($valor === null) ? '' : (string)$valor;
            ?>
              <td>
                <input 
                  type="text"
                  class="form-control form-control-sm fator text-end"
                  data-origem-id="<?= $item['origem_id'] ?>"
                  data-destino-id="<?= $item['destino_id'] ?>"
                  data-mes="<?= $mes ?>"
                  data-formato="<?= $fmt ?>"
                  data-original="<?= htmlspecialchars($original) ?>"
                  value="<?= $mask ?>"
                  placeholder="<?= $fmt==='inteiro' ? '0' : '0,00' ?>"
                  <?= $somenteLeitura ? 'disabled' : '' ?>
                >
              </td>
            <?php endfor; ?>
          <?php else: ?>
            <?php 
              $valor = $item['fatores'][1];
              $fmt   = $item['formatodestino'];
              $mask  = ($valor === null) ? '' : (
                $fmt === 'inteiro'
                  ? number_format($valor, 0, ',', '.')
                  : number_format($valor, 2, ',', '.')
              );
              $original = ($valor === null) ? '' : (string)$valor;
            ?>
            <td>
              <input 
                type="text"
                class="form-control form-control-sm fator text-end"
                data-origem-id="<?= $item['origem_id'] ?>"
                data-destino-id="<?= $item['destino_id'] ?>"
                data-mes="0"
                data-formato="<?= $fmt ?>"
                data-original="<?= htmlspecialchars($original) ?>"
                value="<?= $mask ?>"
                placeholder="<?= $fmt==='inteiro' ? '0' : '0,00' ?>"
                <?= $somenteLeitura ? 'disabled' : '' ?>
              >
            </td>
          <?php endif; ?>
        </tr>
      <?php endforeach; ?>
    </tbody>
  </table>

  <div class="d-flex justify-content-between mt-3">
    <a href="?m=cotacao" class="btn btn-outline-secondary">
      <i class="bi bi-arrow-left"></i> Voltar
    </a>
    <button type="submit" class="btn btn-success" <?= $somenteLeitura ? 'disabled' : '' ?>>
      <i class="bi bi-save"></i> Salvar Alterações
    </button>
  </div>
</form>

<?php if (!$somenteLeitura): ?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.min.js"></script>
<script>
$(function() {
  // Aplica máscaras conforme formato da moeda destino
  $('.fator').each(function() {
    aplicarMascara($(this), $(this).data('formato'));
  });

  function aplicarMascara($el, formato) {
    $el.unmask();
    if (formato === 'inteiro') $el.mask('000.000.000', {reverse:true});
    else $el.mask('000.000.000,00', {reverse:true});
  }

  // Destacar células alteradas
  $(document).on('input blur', '.fator', function() {
    const $el = $(this);
    const formato = $el.data('formato');
    const original = $el.data('original'); // número em ponto ou ''
    let atual = $el.val().replace(/\./g, '').replace(',', '.'); // para número

    if (atual === '') {
      if (original === '') $el.removeClass('bg-warning-subtle');
      else $el.addClass('bg-warning-subtle');
      return;
    }
    const num = parseFloat(atual);
    if (isNaN(num)) return;

    const origNum = (original === '') ? null : parseFloat(original);
    const changed = (origNum === null) ? true : (Math.abs(num - origNum) > 1e-9);
    $el.toggleClass('bg-warning-subtle', changed);
  });

  // Salvar apenas alterações
  $('#formEditar').on('submit', function(e) {
    e.preventDefault();
    const payload = [];
    $('.fator').each(function() {
      const $el = $(this);
      const original = $el.data('original'); // em ponto
      let atual = $el.val().replace(/\./g, '').replace(',', '.'); // em ponto
      if (atual === '' && original === '') return;
      const numAtual = (atual === '') ? null : parseFloat(atual);
      const numOrig  = (original === '') ? null : parseFloat(original);

      const mudou = (numOrig === null && numAtual !== null) ||
                    (numOrig !== null && numAtual === null) ||
                    (numOrig !== null && numAtual !== null && Math.abs(numAtual - numOrig) > 1e-9);

      if (mudou && numAtual !== null) {
        payload.push({
          origem_id: parseInt($el.data('origem-id'), 10),
          destino_id: parseInt($el.data('destino-id'), 10),
          mes: parseInt($el.data('mes'), 10),
          fator: numAtual
        });
      }
    });

    if (payload.length === 0) {
      alert('Nenhuma alteração detectada.');
      return;
    }

    fetch('?m=cotacao_editar&ajax=salvar', {
      method: 'POST',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify({ cdexercicio: <?= (int)$id ?>, dados: payload })
    })
    .then(r => r.json())
    .then(resp => {
      alert(resp.msg);
      if (resp.ok) window.location='?m=cotacao';
    })
    .catch(err => alert('Erro ao salvar: ' + err.message));
  });
});
</script>
<?php endif; ?>
