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

// Verificar si ya está autenticado
if (isset($_SESSION['pin_verificado']) && $_SESSION['pin_verificado'] === true) {
    header("Location: reporte.php");
    exit;
}

$error = '';
$bloqueado = false;
$tiempo_bloqueo = 0;

// Obtener IP del usuario
function obtenerIP() {
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        return $_SERVER['REMOTE_ADDR'];
    }
}

$ip_usuario = obtenerIP();

// Verificar si está bloqueado
try {
    $stmt = $pdo->prepare("SELECT bloqueado_hasta, intentos_fallidos FROM seguridad_pin WHERE id = 1");
    $stmt->execute();
    $config_pin = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($config_pin && $config_pin['bloqueado_hasta']) {
        $bloqueado_hasta = strtotime($config_pin['bloqueado_hasta']);
        $ahora = time();
        
        if ($ahora < $bloqueado_hasta) {
            $bloqueado = true;
            $tiempo_bloqueo = ceil(($bloqueado_hasta - $ahora) / 60);
        } else {
            // Desbloquear si ya pasó el tiempo
            $stmt = $pdo->prepare("UPDATE seguridad_pin SET bloqueado_hasta = NULL, intentos_fallidos = 0 WHERE id = 1");
            $stmt->execute();
        }
    }
} catch (PDOException $e) {
    error_log("Error verificando bloqueo: " . $e->getMessage());
}

// Procesar el formulario
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['pin'])) {
    if ($bloqueado) {
        $error = "Acceso bloqueado. Intenta de nuevo en $tiempo_bloqueo minutos.";
    } else {
        $pin_ingresado = trim($_POST['pin']);
        
        // Validar formato del PIN
        if (!preg_match('/^\d{6}$/', $pin_ingresado)) {
            $error = "El PIN debe contener exactamente 6 dígitos.";
        } else {
            try {
                // Obtener el PIN almacenado
                $stmt = $pdo->prepare("SELECT pin, intentos_fallidos FROM seguridad_pin WHERE id = 1");
                $stmt->execute();
                $registro = $stmt->fetch(PDO::FETCH_ASSOC);
                
                if ($registro && password_verify($pin_ingresado, $registro['pin'])) {
                    // PIN correcto
                    $_SESSION['pin_verificado'] = true;
                    $_SESSION['pin_verificado_tiempo'] = time();
                    
                    // Resetear intentos fallidos
                    $stmt = $pdo->prepare("UPDATE seguridad_pin SET intentos_fallidos = 0, bloqueado_hasta = NULL WHERE id = 1");
                    $stmt->execute();
                    
                    // Registrar acceso exitoso
                    $stmt = $pdo->prepare("INSERT INTO registro_accesos_pin (ip_address, exitoso) VALUES (?, 1)");
                    $stmt->execute([$ip_usuario]);
                    
                    header("Location: reporte.php");
                    exit;
                } else {
                    // PIN incorrecto
                    $intentos = $registro['intentos_fallidos'] + 1;
                    
                    // Registrar intento fallido
                    $stmt = $pdo->prepare("INSERT INTO registro_accesos_pin (ip_address, pin_ingresado, exitoso) VALUES (?, ?, 0)");
                    $stmt->execute([$ip_usuario, $pin_ingresado]);
                    
                    if ($intentos >= 5) {
                        // Bloquear por 30 minutos después de 5 intentos fallidos
                        $bloqueado_hasta = date('Y-m-d H:i:s', strtotime('+30 minutes'));
                        $stmt = $pdo->prepare("UPDATE seguridad_pin SET intentos_fallidos = ?, bloqueado_hasta = ? WHERE id = 1");
                        $stmt->execute([$intentos, $bloqueado_hasta]);
                        
                        $error = "Demasiados intentos fallidos. Acceso bloqueado por 30 minutos.";
                        $bloqueado = true;
                        $tiempo_bloqueo = 30;
                    } else {
                        // Actualizar intentos fallidos
                        $stmt = $pdo->prepare("UPDATE seguridad_pin SET intentos_fallidos = ? WHERE id = 1");
                        $stmt->execute([$intentos]);
                        
                        $intentos_restantes = 5 - $intentos;
                        $error = "PIN incorrecto. Te quedan $intentos_restantes intentos.";
                    }
                }
            } catch (PDOException $e) {
                error_log("Error verificando PIN: " . $e->getMessage());
                $error = "Error al verificar el PIN. Intenta de nuevo.";
            }
        }
    }
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Acceso Seguro - Reportes</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
            position: relative;
            overflow: hidden;
        }
        
        /* Partículas de fondo animadas */
        body::before {
            content: '';
            position: absolute;
            width: 200%;
            height: 200%;
            background: radial-gradient(circle, rgba(255,255,255,0.1) 1px, transparent 1px);
            background-size: 50px 50px;
            animation: particleMove 20s linear infinite;
        }
        
        @keyframes particleMove {
            0% { transform: translate(0, 0); }
            100% { transform: translate(50px, 50px); }
        }
        
        .container {
            background: white;
            padding: 40px;
            border-radius: 20px;
            box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
            max-width: 450px;
            width: 100%;
            animation: slideIn 0.5s ease;
            position: relative;
            z-index: 1;
        }
        
        @keyframes slideIn {
            from {
                opacity: 0;
                transform: translateY(-30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }
        
        .lock-icon {
            text-align: center;
            margin-bottom: 30px;
        }
        
        .lock-icon svg {
            width: 80px;
            height: 80px;
            fill: #667eea;
            animation: lockPulse 2s ease-in-out infinite;
        }
        
        @keyframes lockPulse {
            0%, 100% { transform: scale(1); }
            50% { transform: scale(1.05); }
        }
        
        h1 {
            text-align: center;
            color: #333;
            margin-bottom: 10px;
            font-size: 28px;
        }
        
        .subtitle {
            text-align: center;
            color: #666;
            margin-bottom: 30px;
            font-size: 14px;
        }
        
        .pin-input-container {
            display: flex;
            justify-content: center;
            gap: 12px;
            margin-bottom: 30px;
        }
        
        .pin-digit {
            width: 55px;
            height: 65px;
            text-align: center;
            font-size: 32px;
            font-weight: bold;
            border: 2px solid #ddd;
            border-radius: 12px;
            outline: none;
            transition: all 0.3s;
            background: #f8f9fa;
            color: transparent;
            text-shadow: 0 0 8px rgba(0,0,0,0.5);
        }
        
        .pin-digit:focus {
            border-color: #667eea;
            box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1);
            background: white;
            transform: scale(1.05);
        }
        
        .pin-digit.filled {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-color: #667eea;
            color: white;
            text-shadow: none;
            animation: digitFill 0.3s ease;
        }
        
        @keyframes digitFill {
            0% { transform: scale(1); }
            50% { transform: scale(1.1); }
            100% { transform: scale(1); }
        }
        
        /* Mostrar bullets en lugar de números */
        .pin-digit.filled::after {
            content: '●';
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            font-size: 24px;
            color: white;
        }
        
        .pin-digit {
            position: relative;
        }
        
        .error {
            background: linear-gradient(135deg, #ff6b6b, #ee5a6f);
            color: white;
            padding: 15px;
            border-radius: 12px;
            margin-bottom: 20px;
            text-align: center;
            font-size: 14px;
            border: none;
            box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3);
            animation: shake 0.5s ease;
        }
        
        @keyframes shake {
            0%, 100% { transform: translateX(0); }
            10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
            20%, 40%, 60%, 80% { transform: translateX(5px); }
        }
        
        .bloqueado {
            background: linear-gradient(135deg, #f39c12, #e67e22);
            color: white;
            border: none;
        }
        
        .submit-btn {
            width: 100%;
            padding: 16px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            border: none;
            border-radius: 12px;
            font-size: 16px;
            font-weight: bold;
            cursor: pointer;
            transition: all 0.3s;
            box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
        }
        
        .submit-btn:hover:not(:disabled) {
            transform: translateY(-2px);
            box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4);
        }
        
        .submit-btn:active:not(:disabled) {
            transform: translateY(0);
        }
        
        .submit-btn:disabled {
            opacity: 0.5;
            cursor: not-allowed;
            background: #95a5a6;
        }
        
        .back-link {
            text-align: center;
            margin-top: 20px;
        }
        
        .back-link a {
            color: #667eea;
            text-decoration: none;
            font-size: 14px;
            transition: all 0.3s;
        }
        
        .back-link a:hover {
            color: #764ba2;
            text-decoration: underline;
        }
        
        .security-info {
            background: linear-gradient(135deg, #e7f3ff, #f0f8ff);
            padding: 15px;
            border-radius: 12px;
            margin-top: 20px;
            font-size: 12px;
            color: #666;
            text-align: center;
            border-left: 4px solid #667eea;
        }
        
        .loading-dots {
            display: none;
            text-align: center;
            margin-top: 10px;
        }
        
        .loading-dots.active {
            display: block;
        }
        
        .loading-dots span {
            display: inline-block;
            width: 8px;
            height: 8px;
            border-radius: 50%;
            background: #667eea;
            margin: 0 3px;
            animation: dotBounce 1.4s infinite ease-in-out both;
        }
        
        .loading-dots span:nth-child(1) { animation-delay: -0.32s; }
        .loading-dots span:nth-child(2) { animation-delay: -0.16s; }
        
        @keyframes dotBounce {
            0%, 80%, 100% { transform: scale(0); }
            40% { transform: scale(1); }
        }
        
        @media (max-width: 500px) {
            .container {
                padding: 30px 20px;
            }
            
            .pin-digit {
                width: 45px;
                height: 55px;
                font-size: 28px;
            }
            
            h1 {
                font-size: 24px;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="lock-icon">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                <path d="M12 1C8.676 1 6 3.676 6 7v3H5c-1.104 0-2 .896-2 2v10c0 1.104.896 2 2 2h14c1.104 0 2-.896 2-2V12c0-1.104-.896-2-2-2h-1V7c0-3.324-2.676-6-6-6zm0 2c2.276 0 4 1.724 4 4v3H8V7c0-2.276 1.724-4 4-4zm0 9c1.104 0 2 .896 2 2 0 .74-.402 1.387-1 1.732V18h-2v-2.268c-.598-.345-1-.992-1-1.732 0-1.104.896-2 2-2z"/>
            </svg>
        </div>
        
        <h1>🔐 Acceso Seguro</h1>
        <p class="subtitle">Ingresa el PIN de 6 dígitos para acceder a los reportes</p>
        
        <?php if ($error): ?>
            <div class="error <?php echo $bloqueado ? 'bloqueado' : ''; ?>">
                <?php echo htmlspecialchars($error); ?>
            </div>
        <?php endif; ?>
        
        <form method="POST" action="" id="pinForm">
            <div class="pin-input-container">
                <input type="password" inputmode="numeric" maxlength="1" class="pin-digit" id="digit1" autocomplete="off" <?php echo $bloqueado ? 'disabled' : ''; ?>>
                <input type="password" inputmode="numeric" maxlength="1" class="pin-digit" id="digit2" autocomplete="off" <?php echo $bloqueado ? 'disabled' : ''; ?>>
                <input type="password" inputmode="numeric" maxlength="1" class="pin-digit" id="digit3" autocomplete="off" <?php echo $bloqueado ? 'disabled' : ''; ?>>
                <input type="password" inputmode="numeric" maxlength="1" class="pin-digit" id="digit4" autocomplete="off" <?php echo $bloqueado ? 'disabled' : ''; ?>>
                <input type="password" inputmode="numeric" maxlength="1" class="pin-digit" id="digit5" autocomplete="off" <?php echo $bloqueado ? 'disabled' : ''; ?>>
                <input type="password" inputmode="numeric" maxlength="1" class="pin-digit" id="digit6" autocomplete="off" <?php echo $bloqueado ? 'disabled' : ''; ?>>
            </div>
            
            <input type="hidden" name="pin" id="pinValue">
            
            <button type="submit" class="submit-btn" id="submitBtn" <?php echo $bloqueado ? 'disabled' : ''; ?>>
                <?php echo $bloqueado ? '🔒 BLOQUEADO' : '✓ VERIFICAR PIN'; ?>
            </button>
            
            <div class="loading-dots" id="loadingDots">
                <span></span>
                <span></span>
                <span></span>
            </div>
        </form>
        
        <div class="back-link">
            <a href="index.php">← Volver al inicio</a>
        </div>
        
        <div class="security-info">
            🔒 Este acceso está protegido. Después de 5 intentos fallidos, el sistema se bloqueará por 30 minutos.
        </div>
    </div>
    
    <script>
        const digits = document.querySelectorAll('.pin-digit');
        const pinValue = document.getElementById('pinValue');
        const form = document.getElementById('pinForm');
        const submitBtn = document.getElementById('submitBtn');
        const loadingDots = document.getElementById('loadingDots');
        
        // Enfocar el primer input al cargar
        digits[0].focus();
        
        // Manejar entrada en cada dígito
        digits.forEach((digit, index) => {
            digit.addEventListener('input', (e) => {
                let value = e.target.value;
                
                // Solo permitir números
                value = value.replace(/\D/g, '');
                e.target.value = value;
                
                if (value) {
                    // Marcar como lleno
                    e.target.classList.add('filled');
                    
                    // Mover al siguiente input
                    if (index < digits.length - 1) {
                        digits[index + 1].focus();
                    } else {
                        // Si es el último dígito, construir el PIN y enviar
                        updatePinValue();
                        if (pinValue.value.length === 6) {
                            loadingDots.classList.add('active');
                            submitBtn.disabled = true;
                            setTimeout(() => form.submit(), 500);
                        }
                    }
                }
            });
            
            // Manejar tecla de retroceso
            digit.addEventListener('keydown', (e) => {
                if (e.key === 'Backspace') {
                    if (!e.target.value && index > 0) {
                        digits[index - 1].focus();
                        digits[index - 1].value = '';
                        digits[index - 1].classList.remove('filled');
                    } else {
                        e.target.classList.remove('filled');
                    }
                }
            });
            
            // Manejar pegado
            digit.addEventListener('paste', (e) => {
                e.preventDefault();
                const pastedData = e.clipboardData.getData('text').replace(/\D/g, '').slice(0, 6);
                
                pastedData.split('').forEach((char, i) => {
                    if (i < digits.length) {
                        digits[i].value = char;
                        digits[i].classList.add('filled');
                    }
                });
                
                if (pastedData.length === 6) {
                    updatePinValue();
                    loadingDots.classList.add('active');
                    submitBtn.disabled = true;
                    setTimeout(() => form.submit(), 500);
                } else if (pastedData.length > 0) {
                    digits[Math.min(pastedData.length, digits.length - 1)].focus();
                }
            });
            
            // Prevenir mostrar el valor
            digit.addEventListener('focus', (e) => {
                e.target.style.caretColor = 'transparent';
            });
        });
        
        function updatePinValue() {
            const pin = Array.from(digits).map(d => d.value).join('');
            pinValue.value = pin;
        }
        
        // Prevenir envío si no está completo
        form.addEventListener('submit', (e) => {
            updatePinValue();
            if (pinValue.value.length !== 6) {
                e.preventDefault();
                // Encontrar el primer input vacío y enfocarlo
                for (let i = 0; i < digits.length; i++) {
                    if (!digits[i].value) {
                        digits[i].focus();
                        break;
                    }
                }
            }
        });
    </script>
</body>
</html>