<?php
/**
 * api-admin.php — API backend para o painel admin TEN Internet
 * Requer MySQL. Configure as credenciais abaixo.
 * Coloque na mesma pasta do admin-portal.html
 */

// ══════════════════════════════════════
//  CONFIG BANCO DE DADOS
// ══════════════════════════════════════
define('DB_HOST', 'localhost');
define('DB_NAME', 'quarkplus_portal');      // ← altere para o nome do seu banco
define('DB_USER', 'quarkplus_portal');    // ← altere para o usuário do banco
define('DB_PASS', 'DFG8wmpa7y86');      // ← altere para a senha do banco
define('DB_CHARSET', 'utf8mb4');

// ══════════════════════════════════════
//  CORS + HEADERS
// ══════════════════════════════════════
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }
if ($_SERVER['REQUEST_METHOD'] !== 'POST')    { http_response_code(405); echo json_encode(['erro' => 'Método não permitido']); exit; }

// ══════════════════════════════════════
//  CONEXÃO PDO
// ══════════════════════════════════════
function db() {
    static $pdo = null;
    if ($pdo) return $pdo;
    try {
        $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET;
        $pdo = new PDO($dsn, DB_USER, DB_PASS, [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ]);
        return $pdo;
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['erro' => 'Erro de banco: ' . $e->getMessage()]);
        exit;
    }
}

// ══════════════════════════════════════
//  CRIAR TABELAS (auto-migrate)
// ══════════════════════════════════════
function criarTabelas() {
    $db = db();
    $db->exec("
        CREATE TABLE IF NOT EXISTS ten_acessos (
            id         INT AUTO_INCREMENT PRIMARY KEY,
            cpf        VARCHAR(20)  NOT NULL DEFAULT '',
            nome       VARCHAR(200) NOT NULL DEFAULT '',
            contrato   VARCHAR(50)  NOT NULL DEFAULT '',
            criado_em  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_criado (criado_em),
            INDEX idx_cpf    (cpf)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    ");
    $db->exec("
        CREATE TABLE IF NOT EXISTS ten_banners (
            id        INT AUTO_INCREMENT PRIMARY KEY,
            url       TEXT         NOT NULL,
            nome      VARCHAR(255) NOT NULL DEFAULT '',
            ordem     INT          NOT NULL DEFAULT 0,
            ativo     TINYINT(1)   NOT NULL DEFAULT 1,
            criado_em DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    ");
    $db->exec("
        CREATE TABLE IF NOT EXISTS ten_config (
            chave VARCHAR(100) PRIMARY KEY,
            valor TEXT NOT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    ");
    // Inserir credenciais padrão se não existirem
    $db->exec("
        INSERT IGNORE INTO ten_config (chave, valor) VALUES
            ('email', 'admin@teninternet.com.br'),
            ('senha', 'ten@2024'),
            ('log_acessos', '1'),
            ('carousel_auto', '1'),
            ('desbloqueio', '1'),
            ('portal_url', '')
    ");
}

// ══════════════════════════════════════
//  HELPERS
// ══════════════════════════════════════
function ok($data = [])  { echo json_encode(array_merge(['ok' => true], $data)); exit; }
function erro($msg, $code = 400) { http_response_code($code); echo json_encode(['ok' => false, 'erro' => $msg]); exit; }
function cfg($chave) {
    $r = db()->prepare('SELECT valor FROM ten_config WHERE chave = ?');
    $r->execute([$chave]);
    $row = $r->fetch();
    return $row ? $row['valor'] : null;
}
function setCfg($chave, $valor) {
    db()->prepare('INSERT INTO ten_config (chave, valor) VALUES (?,?) ON DUPLICATE KEY UPDATE valor=?')
        ->execute([$chave, $valor, $valor]);
}

// ══════════════════════════════════════
//  ROTEAMENTO
// ══════════════════════════════════════
criarTabelas();

$body = json_decode(file_get_contents('php://input'), true) ?: [];
$acao = $body['acao'] ?? '';

// ── LOGIN ──────────────────────────────
if ($acao === 'login') {
    $email = trim($body['email'] ?? '');
    $senha = $body['senha'] ?? '';
    if (!$email || !$senha) erro('Dados inválidos');
    if ($email === cfg('email') && $senha === cfg('senha')) {
        // Gera token de sessão simples (para uso em chamadas subsequentes)
        $token = bin2hex(random_bytes(24));
        setCfg('sessao_token', $token);
        setCfg('sessao_ts', time());
        ok(['token' => $token, 'email' => $email]);
    } else {
        erro('E-mail ou senha incorretos', 401);
    }
}

// ── VALIDAR TOKEN ──────────────────────
function validarToken($token) {
    if (!$token) erro('Não autenticado', 401);
    $salvo = cfg('sessao_token');
    $ts    = (int) cfg('sessao_ts');
    if (!$salvo || $salvo !== $token) erro('Token inválido', 401);
    if (time() - $ts > 8 * 3600) erro('Sessão expirada', 401); // 8h
    // Renova timestamp
    setCfg('sessao_ts', time());
}

$token = $body['token'] ?? '';

// ── REGISTRAR ACESSO (chamado pelo portal do cliente) ──
if ($acao === 'registrar_acesso') {
    // Esta rota não precisa de token admin — é chamada pelo portal público
    $log = cfg('log_acessos');
    if ($log === '0') ok(['msg' => 'Log desativado']);
    $cpf      = substr(preg_replace('/\D/', '', $body['cpf'] ?? ''), 0, 20);
    $nome     = substr(trim($body['nome']     ?? ''), 0, 200);
    $contrato = substr(trim($body['contrato'] ?? ''), 0, 50);
    if (!$cpf) erro('CPF obrigatório');
    db()->prepare('INSERT INTO ten_acessos (cpf, nome, contrato) VALUES (?,?,?)')
        ->execute([$cpf, $nome, $contrato]);
    // Manter máx. 500 registros
    db()->exec('DELETE FROM ten_acessos WHERE id NOT IN (SELECT id FROM (SELECT id FROM ten_acessos ORDER BY id DESC LIMIT 500) t)');
    ok(['msg' => 'Acesso registrado']);
}

// ── ROTAS AUTENTICADAS ──────────────────
validarToken($token);

// ── STATS ──────────────────────────────
if ($acao === 'stats') {
    $db = db();

    $hoje   = date('Y-m-d');
    $semana = date('Y-m-d', strtotime('-7 days'));

    $r = $db->query('SELECT COUNT(*) FROM ten_acessos');
    $total = (int) $r->fetchColumn();

    $r = $db->prepare('SELECT COUNT(DISTINCT cpf) FROM ten_acessos WHERE DATE(criado_em) = ?');
    $r->execute([$hoje]);
    $hoje_uniq = (int) $r->fetchColumn();

    $r = $db->prepare('SELECT COUNT(*) FROM ten_acessos WHERE DATE(criado_em) >= ?');
    $r->execute([$semana]);
    $semana_cnt = (int) $r->fetchColumn();

    $r = $db->query('SELECT COUNT(*) FROM ten_banners WHERE ativo = 1');
    $banners_ativos = (int) $r->fetchColumn();

    // Gráfico 7 dias
    $r = $db->prepare('
        SELECT DATE(criado_em) AS dia, COUNT(*) AS total
        FROM ten_acessos
        WHERE criado_em >= ?
        GROUP BY DATE(criado_em)
    ');
    $r->execute([date('Y-m-d H:i:s', strtotime('-7 days'))]);
    $grafico_raw = $r->fetchAll();
    $grafico = [];
    for ($i = 6; $i >= 0; $i--) {
        $d = date('Y-m-d', strtotime("-{$i} days"));
        $cnt = 0;
        foreach ($grafico_raw as $g) {
            if ($g['dia'] === $d) { $cnt = (int)$g['total']; break; }
        }
        $grafico[] = ['dia' => $d, 'total' => $cnt];
    }

    ok([
        'total'          => $total,
        'hoje'           => $hoje_uniq,
        'semana'         => $semana_cnt,
        'banners_ativos' => $banners_ativos,
        'grafico'        => $grafico,
    ]);
}

// ── ACESSOS RECENTES ───────────────────
if ($acao === 'acessos_recentes') {
    $limit = min((int)($body['limit'] ?? 10), 50);
    $r = db()->prepare('SELECT * FROM ten_acessos ORDER BY id DESC LIMIT ?');
    $r->execute([$limit]);
    ok(['acessos' => $r->fetchAll()]);
}

// ── ACESSOS TODOS ──────────────────────
if ($acao === 'acessos_todos') {
    $r = db()->query('SELECT * FROM ten_acessos ORDER BY id DESC LIMIT 500');
    ok(['acessos' => $r->fetchAll()]);
}

// ── LIMPAR ACESSOS ─────────────────────
if ($acao === 'limpar_acessos') {
    db()->exec('TRUNCATE TABLE ten_acessos');
    ok(['msg' => 'Histórico apagado']);
}

// ── BANNERS ────────────────────────────
if ($acao === 'listar_banners') {
    $r = db()->query('SELECT * FROM ten_banners WHERE ativo = 1 ORDER BY ordem ASC, id ASC');
    ok(['banners' => $r->fetchAll()]);
}

if ($acao === 'add_banner') {
    $url  = trim($body['url']  ?? '');
    $nome = trim($body['nome'] ?? '');
    if (!$url) erro('URL obrigatória');
    $r = db()->query('SELECT MAX(ordem) FROM ten_banners');
    $maxOrdem = (int) $r->fetchColumn();
    db()->prepare('INSERT INTO ten_banners (url, nome, ordem) VALUES (?,?,?)')
        ->execute([$url, $nome ?: basename($url), $maxOrdem + 1]);
    ok(['id' => db()->lastInsertId()]);
}

if ($acao === 'remover_banner') {
    $id = (int)($body['id'] ?? 0);
    if (!$id) erro('ID inválido');
    db()->prepare('UPDATE ten_banners SET ativo = 0 WHERE id = ?')->execute([$id]);
    ok();
}

if ($acao === 'reordenar_banners') {
    $ids = $body['ids'] ?? [];
    if (!is_array($ids)) erro('IDs inválidos');
    $stmt = db()->prepare('UPDATE ten_banners SET ordem = ? WHERE id = ?');
    foreach ($ids as $ordem => $id) {
        $stmt->execute([(int)$ordem, (int)$id]);
    }
    ok();
}

// ── CONFIG ─────────────────────────────
if ($acao === 'get_config') {
    ok([
        'email'          => cfg('email'),
        'log_acessos'    => cfg('log_acessos') !== '0',
        'carousel_auto'  => cfg('carousel_auto') !== '0',
        'desbloqueio'    => cfg('desbloqueio') !== '0',
        'portal_url'     => cfg('portal_url') ?? '',
    ]);
}

if ($acao === 'set_config') {
    $campos = ['log_acessos', 'carousel_auto', 'desbloqueio', 'portal_url'];
    foreach ($campos as $c) {
        if (isset($body[$c])) setCfg($c, $body[$c] ? '1' : '0');
    }
    if (!empty($body['portal_url'])) setCfg('portal_url', $body['portal_url']);
    ok();
}

if ($acao === 'salvar_credenciais') {
    $email = trim($body['email'] ?? '');
    $senha = $body['senha'] ?? '';
    if (!$email || !filter_var($email, FILTER_VALIDATE_EMAIL)) erro('E-mail inválido');
    if ($senha && strlen($senha) < 6) erro('Senha deve ter ao menos 6 caracteres');
    setCfg('email', $email);
    if ($senha) setCfg('senha', $senha);
    ok();
}

erro('Ação desconhecida: ' . $acao);
