<?php
session_start();
if (!isset($_SESSION['usuario_id']) || empty($_SESSION['usuario_id']) || 
    !in_array($_SESSION['rol'], ['admin', 'cobrador', 'vendedor'])) {
    header('Location: ../login.php');
    exit;
}

require_once '../includes/config.php';
require_once '../includes/db.php';
//require_once '../includes/theme_only.php'; 


$db = new Database();
$config = $db->query("SELECT favicon, logo, color_principal, color_secundario, ciudad, nombre_comercio FROM configuracion WHERE id = 1")->fetch();

// Obtener la lista de clientes con teléfonos
$clientes = $db->query("
    SELECT id_cliente, nombre, apellidos, tipo_documento, numero_documento, 
           telefono_principal, telefono_secundario 
    FROM clientes 
    ORDER BY nombre")->fetchAll();

// Obtener lista de feriados después de la conexión a la base de datos
$feriados = $db->query("SELECT fecha FROM feriados")->fetchAll(PDO::FETCH_COLUMN);

// Función para verificar si una fecha es feriado o domingo
function esFinDeSemanaOFeriado($fecha, $feriados) {
    $timestamp = strtotime($fecha);
    $esDomingo = date('N', $timestamp) == 7;
    $esFeriado = in_array(date('Y-m-d', $timestamp), $feriados);
    return $esDomingo || $esFeriado;
}

// Función para obtener siguiente día hábil
function obtenerSiguienteDiaHabil($fecha, $feriados) {
    $timestamp = strtotime($fecha);
    do {
        $timestamp = strtotime('+1 day', $timestamp);
    } while (esFinDeSemanaOFeriado(date('Y-m-d', $timestamp), $feriados));
    return date('Y-m-d', $timestamp);
}

// Procesar el formulario
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        $pdo = $db->getPDO();
        $pdo->beginTransaction();

        $cliente_id = $_POST['cliente_id'];
        $concepto = $_POST['concepto'];
        $cuota_inicial = $_POST['cuota_inicial'];
        $cantidad_cuotas = $_POST['cantidad_cuotas'];
        $monto_cuota = $_POST['monto_cuota'];
        $usuario_id = $_SESSION['usuario_id'];
        $fecha_vencimiento_inicial = new DateTime($_POST['fecha_vencimiento']);

        // Generar código timestamp de 13 dígitos
        $timestamp = round(microtime(true) * 1000);

        // Insertar nuevo producto invisible con campos obligatorios
        $stmt_producto = $pdo->prepare("
            INSERT INTO productos 
            (codigo, titulo, visible, id_proveedor, id_seccion, id_subseccion, id_marca,
             precio_compra, precio_venta1, iva) 
            VALUES 
            (:codigo, :titulo, 0, :id_proveedor, :id_seccion, :id_subseccion, :id_marca,
             0.00, 0.00, 0.00)
        ");

        $stmt_producto->execute([
            ':codigo' => $timestamp,
            ':titulo' => $concepto,
            ':id_proveedor' => '0',
            ':id_seccion' => '0',
            ':id_subseccion' => '0',
            ':id_marca' => '0'
        ]);

        $producto_id = $pdo->lastInsertId();

        // Obtener los teléfonos del cliente
        $stmt = $pdo->prepare("
            SELECT telefono_principal, telefono_secundario 
            FROM clientes 
            WHERE id_cliente = ?
        ");
        $stmt->execute([$cliente_id]);
        $cliente_datos = $stmt->fetch();

        // Generar un ID más corto usando solo los últimos 8 dígitos del timestamp
        $pagare_id = intval(substr(time(), -8));
        
        // Obtener configuración de días de aviso
        $config_avisos = $db->query("
            SELECT dias_primer_aviso, dias_tercer_aviso 
            FROM configuracion 
            WHERE id = 1
        ")->fetch();

        $diasPrimerAviso = $config_avisos['dias_primer_aviso'] ?? 5;
        $diasTercerAviso = $config_avisos['dias_tercer_aviso'] ?? 5;

        // Insertar cada cuota con las fechas de aviso
        $stmt = $pdo->prepare("
            INSERT INTO cuotas 
            (venta_id, numero_cuota, monto, fecha_vencimiento, estado, usuario_id, 
             cliente_id, producto_id, primer_aviso, segundo_aviso, tercer_aviso)
            VALUES 
            (:venta_id, :numero_cuota, :monto, :fecha_vencimiento, 'PENDIENTE', :usuario_id,
             :cliente_id, :producto_id, :primer_aviso, :segundo_aviso, :tercer_aviso)
        ");

        // Calcular fechas y crear cuotas usando la fecha de vencimiento proporcionada
        for ($i = $cuota_inicial; $i <= $cantidad_cuotas; $i++) {
            $fecha_vencimiento = clone $fecha_vencimiento_inicial;
            if ($i > $cuota_inicial) {
                $fecha_vencimiento->modify("+" . (($i - $cuota_inicial) * 30) . " days");
            }

            // Verificar y ajustar la fecha de vencimiento si cae en feriado o domingo
            $fecha_venc = $fecha_vencimiento->format('Y-m-d');
            while (esFinDeSemanaOFeriado($fecha_venc, $feriados)) {
                $fecha_venc = obtenerSiguienteDiaHabil($fecha_venc, $feriados);
            }
            $fecha_vencimiento = new DateTime($fecha_venc);

            // Calcular fechas de aviso
            $fecha_primer_aviso = clone $fecha_vencimiento;
            $fecha_primer_aviso->modify("-{$diasPrimerAviso} days");
            
            $fecha_tercer_aviso = clone $fecha_vencimiento;
            $fecha_tercer_aviso->modify("+{$diasTercerAviso} days");

            $stmt->execute([
                ':venta_id' => $pagare_id,
                ':numero_cuota' => $i,
                ':monto' => $monto_cuota,
                ':fecha_vencimiento' => $fecha_vencimiento->format('Y-m-d'),
                ':usuario_id' => $usuario_id,
                ':cliente_id' => $cliente_id,
                ':producto_id' => $producto_id,
                ':primer_aviso' => $fecha_primer_aviso->format('Y-m-d'),
                ':segundo_aviso' => $fecha_vencimiento->format('Y-m-d'),
                ':tercer_aviso' => $fecha_tercer_aviso->format('Y-m-d')
            ]);
        }

        $pdo->commit();
        $mensaje = "Pagarés registrados correctamente";
    } catch (Exception $e) {
        if (isset($pdo)) {
            $pdo->rollBack();
        }
        $error = "Error al registrar los pagarés: " . $e->getMessage();
    }
}
//echo getThemeCSS();
require_once '../includes/header.php';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<?php
    // Modo oscuro
    require_once '../includes/dark_mode.php';
    ?>
    <meta name="color-scheme" content="light dark">
    <?php echo getDarkModeStyles(); ?>

    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gestión de Pagarés - <?= htmlspecialchars($config['nombre_comercio']) ?></title>
    <?php if ($config['favicon']): ?>
    <link rel="icon" type="image/x-icon" href="<?= htmlspecialchars('../uploads/config/' . $config['favicon']) ?>">
    <?php endif; ?>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        body { font-family: 'Poppins', sans-serif; }
        .container { max-width: 800px; padding: 20px; }
        .form-group { margin-bottom: 1rem; }
        .alert { margin-top: 1rem; }
        
        /* Estilos principales */
        h1 { 
            color: <?= htmlspecialchars($config['color_principal']) ?>; 
            margin-bottom: 2rem;
            font-weight: 600;
            font-size: 1.75rem;
        }
        
        /* Estilos para etiquetas */
        label {
            color: <?= htmlspecialchars($config['color_secundario']) ?>;
            font-weight: 500;
            margin-bottom: 0.5rem;
        }
        
        /* Estilos para inputs y select */
        .form-control:focus {
            border-color: <?= htmlspecialchars($config['color_principal']) ?>;
            box-shadow: 0 0 0 0.2rem <?= htmlspecialchars($config['color_principal']) ?>25;
        }
        
        /* Estilos para select */
        select.form-control {
            cursor: pointer;
        }
        
        /* Estilos para botones */
        .btn-primary {
            background-color: <?= htmlspecialchars($config['color_principal']) ?>;
            border-color: <?= htmlspecialchars($config['color_principal']) ?>;
            padding: 0.5rem 1.5rem;
            transition: all 0.3s ease;
        }
        
        .btn-primary:hover {
            background-color: <?= htmlspecialchars($config['color_secundario']) ?>;
            border-color: <?= htmlspecialchars($config['color_secundario']) ?>;
            transform: translateY(-2px);
        }
        
        .btn-secondary {
            background-color: #6c757d;
            border-color: #6c757d;
            padding: 0.5rem 1.5rem;
        }
        
        /* Estilos para validación */
        .was-validated .form-control:valid {
            border-color: <?= htmlspecialchars($config['color_principal']) ?>;
            background-image: none;
        }
        
        .was-validated .form-control:valid:focus {
            border-color: <?= htmlspecialchars($config['color_principal']) ?>;
            box-shadow: 0 0 0 0.2rem <?= htmlspecialchars($config['color_principal']) ?>25;
        }
        
        /* Animación en hover para inputs */
        .form-control:hover {
            border-color: <?= htmlspecialchars($config['color_secundario']) ?>;
        }
        
        /* Estilos para contenedor de botones */
        .buttons-container {
            display: flex;
            gap: 1rem;
            margin-top: 2rem;
        }
        
        .buttons-container .btn {
            flex: 1;
            width: 100%;
        }
        
        @media (max-width: 576px) {
            .buttons-container {
                flex-direction: column;
            }
            
            .buttons-container .btn {
                margin-bottom: 1rem;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <h1 class="mb-4">Registro de Pagarés</h1>
        
        <?php if (isset($mensaje)): ?>
        <div class="alert alert-success"><?= htmlspecialchars($mensaje) ?></div>
        <?php endif; ?>
        
        <?php if (isset($error)): ?>
        <div class="alert alert-danger"><?= htmlspecialchars($error) ?></div>
        <?php endif; ?>

        <form method="POST" class="needs-validation" novalidate>
            <div class="form-group">
                <label for="cliente_id">Cliente:</label>
                <select name="cliente_id" id="cliente_id" class="form-control" required>
                    <option value="">Seleccione un cliente</option>
                    <?php foreach ($clientes as $cliente): ?>
                        <option value="<?= $cliente['id_cliente'] ?>" 
                                data-tel1="<?= htmlspecialchars($cliente['telefono_principal']) ?>"
                                data-tel2="<?= htmlspecialchars($cliente['telefono_secundario']) ?>">
                            <?= htmlspecialchars($cliente['nombre'] . ' ' . $cliente['apellidos'] . 
                                ' - ' . $cliente['tipo_documento'] . ': ' . $cliente['numero_documento']) ?>
                        </option>
                    <?php endforeach; ?>
                </select>
            </div>

            <div class="form-group">
                <label for="concepto">Concepto:</label>
                <input type="text" name="concepto" id="concepto" class="form-control" required>
            </div>

            <div class="form-group">
                <label for="cuota_inicial">Número de cuota inicial:</label>
                <input type="number" name="cuota_inicial" id="cuota_inicial" class="form-control" min="1" required>
            </div>

            <div class="form-group">
                <label for="cantidad_cuotas">Cantidad total de cuotas:</label>
                <input type="number" name="cantidad_cuotas" id="cantidad_cuotas" class="form-control" min="1" required>
            </div>

            <div class="form-group">
                <label for="monto_cuota">Monto de cada cuota:</label>
                <input type="number" name="monto_cuota" id="monto_cuota" class="form-control" step="0.01" min="0.01" required>
            </div>

            <div class="form-group">
                <label for="fecha_vencimiento">Fecha de vencimiento primera cuota:</label>
                <input type="date" name="fecha_vencimiento" id="fecha_vencimiento" class="form-control" required>
            </div>

            <div class="buttons-container">
                <button type="submit" class="btn btn-primary">
                    <i class="fas fa-save me-2"></i> Registrar Pagarés
                </button>
                <a href="dashboard.php" class="btn btn-secondary">
                    <i class="fas fa-arrow-left me-2"></i> Volver al menú
                </a>
            </div>
        </form>
    </div>

    <script>
    document.addEventListener('DOMContentLoaded', function() {
        // Validación del formulario
        const form = document.querySelector('.needs-validation');
        form.addEventListener('submit', function(event) {
            if (!form.checkValidity()) {
                event.preventDefault();
                event.stopPropagation();
            }
            form.classList.add('was-validated');
        });

        // Validación de números de cuotas
        const cuotaInicial = document.getElementById('cuota_inicial');
        const cantidadCuotas = document.getElementById('cantidad_cuotas');

        function validarCuotas() {
            if (parseInt(cuotaInicial.value) > parseInt(cantidadCuotas.value)) {
                cantidadCuotas.setCustomValidity('La cantidad total de cuotas debe ser mayor o igual al número de cuota inicial');
            } else {
                cantidadCuotas.setCustomValidity('');
            }
        }

        cuotaInicial.addEventListener('change', validarCuotas);
        cantidadCuotas.addEventListener('change', validarCuotas);

        // Autocompletar teléfonos al seleccionar cliente
        const clienteSelect = document.getElementById('cliente_id');
        clienteSelect.addEventListener('change', function() {
            const selectedOption = this.options[this.selectedIndex];
            const tel1 = selectedOption.dataset.tel1;
            const tel2 = selectedOption.dataset.tel2;
            
            // Los teléfonos se manejarán internamente, no necesitamos mostrarlos en el formulario
            console.log('Teléfonos del cliente seleccionado:', tel1, tel2);
        });

        // Establecer la fecha de hoy sin restricciones
        const fechaInput = document.getElementById('fecha_vencimiento');
        const hoy = new Date();
        fechaInput.value = hoy.toISOString().split('T')[0];
        // Ya no establecemos fechaInput.min para permitir fechas anteriores

    });
    </script>
</body>
</html>
