<?php
declare(strict_types=1);

require_once dirname(__DIR__) . '/_app_guard.php';
app_guard_validate();

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
date_default_timezone_set('America/Sao_Paulo');

function venc_out(array $p): void { echo json_encode($p, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; }
function venc_norm_mac(string $mac): string {
    $c = strtoupper(substr(preg_replace('/[^A-Fa-f0-9]/', '', trim($mac)), 0, 12));
    return strlen($c) === 12 ? implode(':', str_split($c, 2)) : '';
}
function venc_public_base_url(): string {
    $https = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https');
    $scheme = $https ? 'https' : 'http';
    $host = $_SERVER['HTTP_HOST'] ?? '';
    return $host ? rtrim($scheme . '://' . $host, '/') : '';
}
function venc_parse_time($value): int {
    $raw = trim((string)$value);
    if ($raw === '') return 0;
    if (ctype_digit($raw)) {
        $n = (int)$raw;
        if ($n > 1000000000) return $n;
        if (strlen($raw) === 8) {
            $dt = DateTime::createFromFormat('Ymd H:i:s', $raw . ' 23:59:59');
            if ($dt instanceof DateTime) return $dt->getTimestamp();
        }
    }
    $formats = ['d/m/Y H:i:s','d/m/Y H:i','d/m/Y','Y-m-d H:i:s','Y-m-d H:i','Y-m-d','d-m-Y H:i:s','d-m-Y'];
    foreach ($formats as $fmt) {
        $dt = DateTime::createFromFormat($fmt, $raw);
        if ($dt instanceof DateTime) {
            if (strpos($fmt, 'H') === false) $dt->setTime(23, 59, 59);
            return $dt->getTimestamp();
        }
    }
    $ts = strtotime($raw);
    return $ts ? (int)$ts : 0;
}
function venc_format_text(int $ts, string $fallback): string {
    if ($ts > 0) return date('d/m/Y', $ts);
    return trim($fallback);
}
function venc_calendar_days(int $ts): int {
    if ($ts <= 0) return 0;
    $tz = new DateTimeZone('America/Sao_Paulo');
    $today = new DateTimeImmutable('today', $tz);
    $expiry = (new DateTimeImmutable('@' . $ts))->setTimezone($tz)->setTime(0, 0, 0);
    return (int)$today->diff($expiry)->format('%r%a');
}

try {
    $db = new PDO('sqlite:' . dirname(__DIR__) . '/db.db');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $db->exec("CREATE TABLE IF NOT EXISTS vencimento_config (
        id INTEGER PRIMARY KEY CHECK (id = 1),
        ativo INTEGER NOT NULL DEFAULT 1,
        dias_antes INTEGER NOT NULL DEFAULT 7,
        titulo TEXT DEFAULT 'Seu acesso está perto de vencer',
        mensagem TEXT DEFAULT '',
        mostrar_qrcode INTEGER NOT NULL DEFAULT 1,
        updated_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
    )");
    $db->exec("INSERT OR IGNORE INTO vencimento_config (id, ativo, dias_antes, titulo, mensagem, mostrar_qrcode) VALUES (1,1,7,'Seu acesso está perto de vencer','Renove para continuar assistindo.',1)");

    $mac = venc_norm_mac((string)($_POST['mac'] ?? $_GET['mac'] ?? ''));
    if ($mac === '') venc_out(['status' => 'ok', 'ativo' => false, 'show_modal' => false, 'expired' => false]);

    $st = $db->prepare('SELECT * FROM usuarios WHERE REPLACE(UPPER(mac),\':\',\'\') = REPLACE(UPPER(?),\':\',\'\') LIMIT 1');
    $st->execute([$mac]);
    $u = $st->fetch() ?: [];
    $userFound = !empty($u);

    $rawVenc = trim((string)($u['vencimento'] ?? ''));
    $v = venc_parse_time($rawVenc);
    $vText = venc_format_text($v, $rawVenc);
    $cfg = $db->query('SELECT * FROM vencimento_config WHERE id=1')->fetch() ?: [];

    $active = ((int)($cfg['ativo'] ?? 1) === 1);
    if (!$active || !$userFound || $v <= 0) {
        venc_out([
            'status' => 'ok',
            'ativo' => $active,
            'usuario_encontrado' => $userFound,
            'show_modal' => false,
            'expired' => false,
            'vencimento' => $v,
            'vencimento_text' => $vText,
            'dias_antes' => max(0, min(30, (int)($cfg['dias_antes'] ?? 7))),
            'config_updated_at' => (int)($cfg['updated_at'] ?? 0),
        ]);
    }

    $now = time();
    $diff = $v - $now;
    $calendarDays = venc_calendar_days($v);
    $expired = $diff <= 0;
    $dias = max(0, $calendarDays);
    $diasAntes = max(0, min(30, (int)($cfg['dias_antes'] ?? 7)));
    $show = $expired || ($calendarDays >= 0 && $calendarDays <= $diasAntes);
    $base = venc_public_base_url();

    venc_out([
        'status' => 'ok',
        'ativo' => true,
        'usuario_encontrado' => true,
        'show_modal' => $show,
        'expired' => $expired,
        'dias_restantes' => $dias,
        'dias_antes' => $diasAntes,
        'vencimento' => $v,
        'vencimento_text' => $vText,
        'titulo' => (string)($cfg['titulo'] ?: 'Seu acesso vence em breve'),
        'mensagem' => (string)($cfg['mensagem'] ?: 'Renove para continuar assistindo.'),
        'mostrar_qrcode' => ((int)($cfg['mostrar_qrcode'] ?? 1) === 1),
        'qrcode_url' => ($base ? $base . '/api/img/qrcode.png' : 'api/img/qrcode.png'),
        'auto_close_seconds' => 0,
        'config_updated_at' => (int)($cfg['updated_at'] ?? 0)
    ]);
} catch (Throwable $e) {
    venc_out(['status' => 'ok', 'ativo' => false, 'show_modal' => false, 'expired' => false]);
}
