<?php
require_once __DIR__ . '/config.php';

/** 
 * Devuelve el estado KYC del usuario con valores por defecto si no existen columnas.
 */
function getUserKyc($db, $userId) {
    $stmt = $db->prepare("SELECT kyc_estado, kyc_id_sesion, kyc_verificado_el, kyc_motivo_resultado FROM usuarios WHERE id = ? LIMIT 1");
    if (!$stmt) {
        return [
            'kyc_estado' => 'no_iniciado',
            'kyc_id_sesion' => null,
            'kyc_verificado_el' => null,
            'kyc_motivo_resultado' => null
        ];
    }  
    $stmt->bind_param('i', $userId); 
    $stmt->execute();
    $res = $stmt->get_result();
    $row = $res->fetch_assoc();
    if (!$row) {
        return [
            'kyc_estado' => 'no_iniciado',
            'kyc_id_sesion' => null,
            'kyc_verificado_el' => null,
            'kyc_motivo_resultado' => null
        ];
    }
    // Normaliza valores nulos a estados amigables.
    $row['kyc_estado'] = $row['kyc_estado'] ?? 'no_iniciado';
    return $row; 
}

/**
 * Actualiza el estado KYC del usuario.
 */
function setUserKycStatus($db, $userId, $status, $sessionId = null, $reason = null) {
    $status = strtolower(trim((string)$status));
    $allowed = ['no_iniciado', 'pendiente', 'verificado', 'rechazado'];
    if (!in_array($status, $allowed, true)) {
        $status = 'rechazado';
    }
    $stmt = $db->prepare("
        UPDATE usuarios
        SET kyc_estado = ?, kyc_id_sesion = ?, kyc_motivo_resultado = ?, kyc_verificado_el = CASE WHEN ? = 'verificado' THEN NOW() ELSE kyc_verificado_el END
        WHERE id = ?
    ");
    if (!$stmt) {
        return;
    }
    $stmt->bind_param('ssssi', $status, $sessionId, $reason, $status, $userId);
    $stmt->execute();
}

/**
 * Exige que el usuario tenga KYC verificado; redirige si no est? listo.
 */
function requireKycVerified($db, $userId, $redirect = 'kyc') {
    $kyc = getUserKyc($db, $userId);
    if (($kyc['kyc_estado'] ?? 'no_iniciado') !== 'verificado') {
        $msg = urlencode('Debes verificar tu identidad antes de pagar la suscripci?n.');
        header('Location: ' . $redirect . '?message=' . $msg);
        exit;
    }
}

/**
 * Llamada HTTP al API de Didit.
 */ 
function diditRequest($method, $path, $payload = null) {
    if (!DIDIT_API_KEY) {
        throw new Exception('DIDIT_API_KEY no est? configurado');
    }
    $url = (stripos($path, 'http') === 0) ? $path : (DIDIT_BASE_URL . $path);
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));
    $headers = [
        'x-api-key: ' . DIDIT_API_KEY,
        'Content-Type: application/json',
        'accept: application/json'
    ];
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    if ($payload !== null) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
    }
    $resp = curl_exec($ch);
    if ($resp === false) {
        $err = curl_error($ch);
        curl_close($ch);
        throw new Exception('Fallo al llamar Didit: ' . $err);
    }
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    $data = json_decode($resp, true);
    if ($status >= 400) {
        error_log('[diditRequest] ' . strtoupper($method) . ' ' . $url . ' status ' . $status . ' body: ' . substr($resp, 0, 500));
    }
    if ($status >= 400) {
        $msg = isset($data['message']) ? $data['message'] : ('HTTP ' . $status);
        throw new Exception('Error de Didit: ' . $msg);
    }
    return $data;
}
