<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

// ── Verificación de Bearer token ─────────────────────────────────────────────
require_once __DIR__ . '/../config.php';

$token = null;
$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) {
    $token = $m[1];
}
if (!$token) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'No autorizado']);
    exit;
}
$db = getDB();
$stmtSess = $db->prepare(
    "SELECT idusuarios_sist FROM admin_sessions WHERE token = ? AND expira > NOW() LIMIT 1"
);
$stmtSess->execute([$token]);
$sess = $stmtSess->fetch(PDO::FETCH_ASSOC);
if (!$sess) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Sesión expirada']);
    exit;
}
$method = $_SERVER['REQUEST_METHOD'];
$body   = json_decode(file_get_contents('php://input'), true) ?? [];
$id     = isset($_GET['id']) ? (int)$_GET['id'] : 0;
$accion = $_GET['accion'] ?? '';

// ── GET: Listar avisos ────────────────────────────────────────────────────────
if ($method === 'GET') {
    $stmt = $db->query(
        "SELECT id, titulo, mensaje, id_user, fechaInicio, fechaFin, status
         FROM mensaje
         ORDER BY id DESC"
    );
    $avisos = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode(['success' => true, 'data' => $avisos]);
    exit;
}

// ── POST: Crear aviso ─────────────────────────────────────────────────────────
if ($method === 'POST') {
    $titulo     = trim($body['titulo']     ?? '');
    $mensaje    = trim($body['mensaje']    ?? '');
    $fechaInicio = trim($body['fechaInicio'] ?? '');
    $fechaFin   = trim($body['fechaFin']   ?? '');
    $status     = isset($body['status']) ? (int)$body['status'] : 1;
    $idUser     = (int)$sess['idusuarios_sist'];

    if (!$titulo || !$mensaje || !$fechaInicio || !$fechaFin) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'Todos los campos son requeridos']);
        exit;
    }

    $stmt = $db->prepare(
        "INSERT INTO mensaje (titulo, mensaje, id_user, fechaInicio, fechaFin, status)
         VALUES (?, ?, ?, ?, ?, ?)"
    );
    $stmt->execute([$titulo, $mensaje, $idUser, $fechaInicio, $fechaFin, $status]);
    $newId = $db->lastInsertId();

    // ── Enviar notificación push si el aviso es activo ────────────────────────
    if ($status == 1) {
        enviarPushAvisoNuevo($db, $titulo, $mensaje, (int)$newId);
    }

    echo json_encode(['success' => true, 'id' => $newId, 'message' => 'Aviso creado']);
    exit;
}

// ── PUT: Editar aviso ─────────────────────────────────────────────────────────
if ($method === 'PUT') {
    if (!$id) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'ID requerido']);
        exit;
    }

    // Toggle de status
    if ($accion === 'toggle') {
        $stmtGet = $db->prepare("SELECT status FROM mensaje WHERE id = ?");
        $stmtGet->execute([$id]);
        $aviso = $stmtGet->fetch(PDO::FETCH_ASSOC);
        if (!$aviso) {
            http_response_code(404);
            echo json_encode(['success' => false, 'message' => 'Aviso no encontrado']);
            exit;
        }
        $nuevoStatus = $aviso['status'] == 1 ? 0 : 1;
        $db->prepare("UPDATE mensaje SET status = ? WHERE id = ?")->execute([$nuevoStatus, $id]);
        echo json_encode([
            'success'    => true,
            'message'    => $nuevoStatus == 1 ? 'Aviso activado' : 'Aviso desactivado',
            'new_status' => $nuevoStatus,
        ]);
        exit;
    }

    // Edición completa
    $titulo      = trim($body['titulo']      ?? '');
    $mensaje     = trim($body['mensaje']     ?? '');
    $fechaInicio = trim($body['fechaInicio'] ?? '');
    $fechaFin    = trim($body['fechaFin']    ?? '');
    $status      = isset($body['status']) ? (int)$body['status'] : 1;

    if (!$titulo || !$mensaje || !$fechaInicio || !$fechaFin) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'Todos los campos son requeridos']);
        exit;
    }

    $stmt = $db->prepare(
        "UPDATE mensaje SET titulo=?, mensaje=?, fechaInicio=?, fechaFin=?, status=?
         WHERE id=?"
    );
    $stmt->execute([$titulo, $mensaje, $fechaInicio, $fechaFin, $status, $id]);

    echo json_encode(['success' => true, 'message' => 'Aviso actualizado']);
    exit;
}

// ── DELETE: Eliminar aviso ────────────────────────────────────────────────────
if ($method === 'DELETE') {
    if (!$id) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'ID requerido']);
        exit;
    }
    $db->prepare("DELETE FROM mensaje WHERE id = ?")->execute([$id]);
    echo json_encode(['success' => true, 'message' => 'Aviso eliminado']);
    exit;
}

http_response_code(405);
echo json_encode(['success' => false, 'message' => 'Método no permitido']);

// ── Función: Enviar push a todos los distribuidores con token ─────────────────
function enviarPushAvisoNuevo(PDO $db, string $titulo, string $mensaje, int $avisoId): void {
    // Obtener todos los push_tokens activos
    try {
        $stmt = $db->query(
            "SELECT push_token FROM inversionista
             WHERE push_token IS NOT NULL AND push_token != '' AND push_token LIKE 'ExponentPushToken%'"
        );
        $tokens = $stmt->fetchAll(PDO::FETCH_COLUMN);
    } catch (Exception $e) {
        // La columna push_token puede no existir aún
        return;
    }

    if (empty($tokens)) return;

    // Expo Push API acepta hasta 100 tokens por request
    $chunks = array_chunk($tokens, 100);
    $preview = mb_substr(strip_tags($mensaje), 0, 100);

    foreach ($chunks as $chunk) {
        $messages = array_map(function($token) use ($titulo, $preview, $avisoId) {
            return [
                'to'    => $token,
                'title' => $titulo,
                'body'  => $preview,
                'sound' => 'default',
                'data'  => [
                    'url'      => '/aviso/' . $avisoId,
                    'aviso_id' => $avisoId,
                ],
                'channelId' => 'avisos',
            ];
        }, $chunk);

        $ch = curl_init('https://exp.host/--/api/v2/push/send');
        curl_setopt_array($ch, [
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => json_encode($messages),
            CURLOPT_HTTPHEADER     => [
                'Content-Type: application/json',
                'Accept: application/json',
                'Accept-Encoding: gzip, deflate',
            ],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 10,
        ]);
        curl_exec($ch);
        curl_close($ch);
    }
}
