<?php
/**
 * Archivo de configuración
 * Conexión a base de datos y ajustes del sistema.
 */
 
// Cargador liviano de .env (sin dependencias externas).
// Lee KEY=VALUE e ignora comentarios (# ...).
function loadEnvFile($path) {
    if (!is_readable($path)) return; 
    $lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    foreach ($lines as $line) {
        $line = trim($line);
        if ($line === '' || $line[0] === '#') continue;
        $eq = strpos($line, '=');
        if ($eq === false) continue;
        $key = trim(substr($line, 0, $eq));
        $val = trim(substr($line, $eq + 1));
        if ($val !== '' && ($val[0] === '"' || $val[0] === '\'')) {
            $val = trim($val, "\"' ");
        }
        if (getenv($key) === false) {
            putenv($key . '=' . $val);
            $_ENV[$key] = $val;
            $_SERVER[$key] = $val;
        }
    }
}

// Carga .env desde la raíz del proyecto si existe.
loadEnvFile(__DIR__ . '/../.env');

// Configuración de base de datos 
define('DB_HOST', getenv('DB_HOST') ?: 'localhost');
define('DB_USER', getenv('DB_USER') ?: 'codexcol_firmador');
define('DB_PASS', getenv('DB_PASS') ?: 'bandbandfirmador');
define('DB_NAME', getenv('DB_NAME') ?: 'codexcol_firmas_pdf');

// Configuración de seguridad
define('SECRET_KEY', getenv('SECRET_KEY') ?: 'your-very-secure-secret-key-change-this-in-production');

// URL base (cambiar al dominio correspondiente)
define('BASE_URL', getenv('BASE_URL') ?: 'https://mercavilla.com/v2/firma');
 
// KYC (Didit) Settings
define('DIDIT_API_KEY', getenv('DIDIT_API_KEY') ?: 'myRJox5Tvg7Lc-EnXfwnY3_5DtCKGgB9VZ-66ek76JI');
define('DIDIT_BASE_URL', rtrim(getenv('DIDIT_BASE_URL') ?: 'https://verification.didit.me', '/'));
define('DIDIT_FLOW_ID', getenv('DIDIT_FLOW_ID') ?: '48ef6540-3a9b-4339-80d4-4a29b2e527f9');
define('DIDIT_WEBHOOK_TOKEN', getenv('DIDIT_WEBHOOK_TOKEN') ?: 'lUCSqaz7JkXuSQU4zrZ8qDAuzBkcnIdD7ToN_Utm_CI');

// Configuración de correo
// Define correo y nombre para notificaciones
// Nota: asegúrate que el servidor pueda enviar correos desde esta dirección 
define('MAIL_FROM', getenv('MAIL_FROM') ?: 'no-reply@mercavilla.com');
define('MAIL_FROM_NAME', getenv('MAIL_FROM_NAME') ?: 'Firmador de PDFs CODEX');

/// Payments (Stripe) Settings — use environment/.env (no hardcoded keys)
// See: https://stripe.com/docs/keys#safe-keys
// Create a Product in Stripe with recurring Price and set STRIPE_PRICE_ID
define('STRIPE_SECRET_KEY', getenv('STRIPE_SECRET_KEY') ?: '');
define('STRIPE_PUBLISHABLE_KEY', getenv('STRIPE_PUBLISHABLE_KEY') ?: '');
define('STRIPE_PRICE_ID', getenv('STRIPE_PRICE_ID') ?: ''); // e.g., price_12345 for monthly plan
define('STRIPE_WEBHOOK_SECRET', getenv('STRIPE_WEBHOOK_SECRET') ?: '');

// File Upload Settings
define('MAX_FILE_SIZE', 10485760); // 10MB in bytes
define('ALLOWED_EXTENSIONS', ['pdf']);

// Timezone
date_default_timezone_set('America/Bogota');

/**
 * Devuelve una conexi?n a la base de datos
 */
function getDatabaseConnection() {
    $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    
    if ($conn->connect_error) {
        die(json_encode([
            'success' => false,
            'message' => 'Error de conexión a la base de datos'
        ]));
    }
     
    $conn->set_charset('utf8mb4');
    return $conn;
}

/**
 * Limpia datos de entrada
 */
function sanitizeInput($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

/**
 * Valida la carga de un archivo
 */
function validateFileUpload($file) {
    if (!isset($file) || $file['error'] !== UPLOAD_ERR_OK) {
        return ['valid' => false, 'message' => 'Error al subir el archivo'];
    }
    
    if ($file['size'] > MAX_FILE_SIZE) {
        return ['valid' => false, 'message' => 'El archivo excede el tamaño máximo permitido'];
    }
    
    $fileExtension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    if (!in_array($fileExtension, ALLOWED_EXTENSIONS)) {
        return ['valid' => false, 'message' => 'Tipo de archivo no permitido'];
    }
    
    // Verify it's actually a PDF
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimeType = finfo_file($finfo, $file['tmp_name']);
    finfo_close($finfo);
    
    if ($mimeType !== 'application/pdf') {
        return ['valid' => false, 'message' => 'El archivo no es un PDF válido'];
    }
    
    return ['valid' => true];
}

/**
 * Envía un correo HTML simple
 * Usa PHP mail() con encabezados b?sicos. Para mejor entregabilidad,
 * considera SMTP con una librer?a como PHPMailer.
 */
function sendEmail($to, $subject, $htmlBody, $replyTo = null) {
    $fromEmail = MAIL_FROM;
    $fromName = MAIL_FROM_NAME;

    $headers = [];
    $headers[] = 'MIME-Version: 1.0';
    $headers[] = 'Content-type: text/html; charset=UTF-8';
    $headers[] = 'From: ' . sprintf('"%s" <%s>', addslashes($fromName), $fromEmail);
    if ($replyTo) {
        $headers[] = 'Reply-To: ' . $replyTo;
    }
    $headers[] = 'X-Mailer: PHP/' . phpversion();

    $headersStr = implode("\r\n", $headers);
    return @mail($to, $subject, $htmlBody, $headersStr);
}

/**
 * Solicitud m?nima a Stripe v?a cURL
 */
function stripeRequest($method, $path, $payload = null) {
    if (!defined('STRIPE_SECRET_KEY') || STRIPE_SECRET_KEY === '') {
        throw new Exception('Stripe secret key not configured');
    }
    $url = 'https://api.stripe.com/v1' . $path;
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERPWD, STRIPE_SECRET_KEY . ':');
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));
    $headers = ['Content-Type: application/x-www-form-urlencoded'];
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    if ($payload !== null) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));
    }
    $resp = curl_exec($ch);
    if ($resp === false) {
        $err = curl_error($ch);
        curl_close($ch);
        throw new Exception('Stripe request failed: ' . $err);
    }
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    $data = json_decode($resp, true);
    if ($status >= 400) {
        $msg = isset($data['error']['message']) ? $data['error']['message'] : 'HTTP ' . $status;
        throw new Exception('Stripe API error: ' . $msg);
    }
    return $data;
}

/**
 * Verifica la firma de un webhook de Stripe
 */
function verifyStripeSignature($payload, $sigHeader, $secret) {
    if (!$sigHeader || !$secret) return false;
    $parts = [];
    foreach (explode(',', $sigHeader) as $item) {
        list($k, $v) = array_pad(explode('=', trim($item), 2), 2, null);
        if ($k && $v) $parts[$k][] = $v;
    }
    if (empty($parts['t'][0]) || empty($parts['v1'])) return false;
    $timestamp = $parts['t'][0];
    $signedPayload = $timestamp . '.' . $payload;
    $expected = hash_hmac('sha256', $signedPayload, $secret);
    foreach ($parts['v1'] as $sig) {
        if (hash_equals($expected, $sig)) return true;
    }
    return false;
}
?>
