<?php
session_start();
if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}

require_once 'db/config.php';

function handle_upload($file_key, $current_path = null) {
    if (isset($_FILES[$file_key]) && $_FILES[$file_key]['error'] === UPLOAD_ERR_OK) {
        $upload_dir = 'assets/uploads/vouchers/';
        if (!is_dir($upload_dir)) {
            mkdir($upload_dir, 0775, true);
        }

        if ($current_path && file_exists($current_path)) {
            unlink($current_path);
        }

        $filename = uniqid() . '-' . basename($_FILES[$file_key]['name']);
        $path = $upload_dir . $filename;

        if (move_uploaded_file($_FILES[$file_key]['tmp_name'], $path)) {
            return $path;
        }
        return $current_path;
    }
    return $current_path;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $pdo = db();

    $id = $_POST['id'] ?? null;
    
    $existing_paths = ['voucher_adelanto_path' => null, 'voucher_restante_path' => null];
    if ($id) {
        $stmt = $pdo->prepare('SELECT voucher_adelanto_path, voucher_restante_path FROM pedidos WHERE id = ?');
        $stmt->execute([$id]);
        $existing_paths = $stmt->fetch(PDO::FETCH_ASSOC) ?: $existing_paths;
    }

    $voucher_adelanto_path = handle_upload('voucher_adelanto', $existing_paths['voucher_adelanto_path']);
    $voucher_restante_path = handle_upload('voucher_restante', $existing_paths['voucher_restante_path']);

    $dni = trim($_POST['dni']);
    $nombre_completo = trim($_POST['nombre_completo']);
    $celular = trim($_POST['celular']);
    $sede_envio = trim($_POST['sede_envio']);
    $codigo_rastreo = trim($_POST['codigo_rastreo'] ?? '');
    $codigo_tracking = trim($_POST['codigo_tracking'] ?? '');
    $clave = trim($_POST['clave'] ?? '');

    // --- Manejo de multiples productos ---
    $productos_post = $_POST['productos'] ?? [];
    $producto_nombres = [];
    $cantidad_total = 0;
    $productos_detalle = [];

    if (!empty($productos_post)) {
        foreach ($productos_post as $p) {
            if (!empty($p['nombre']) && !empty($p['cantidad'])) {
                $producto_nombres[] = trim($p['nombre']);
                $cantidad_total += (int)$p['cantidad'];
                $productos_detalle[] = trim($p['nombre']) . ' (x' . (int)$p['cantidad'] . ')';
            }
        }
    }

    $producto = implode(', ', $producto_nombres);
    $cantidad = $cantidad_total;
    $notas_adicionales = "Detalle de productos: " . implode(', ', $productos_detalle);
    // --- Fin del manejo de multiples productos ---

    $monto_total = filter_var($_POST['monto_total'], FILTER_VALIDATE_FLOAT);
    $monto_adelantado = filter_var($_POST['monto_adelantado'], FILTER_VALIDATE_FLOAT);
    $numero_operacion = trim($_POST['numero_operacion']);
    $estado = $_POST['estado'];
    $notas = trim($_POST['notas']);

    if (!empty($productos_detalle)) {
        $notas .= "\n\n" . $notas_adicionales;
    }
    
    if ($estado === 'COMPLETADO ✅' && empty($numero_operacion)) {
        $error_message = urlencode("El número de operación es obligatorio cuando el estado es 'COMPLETADO ✅'.");
        $redirect_url = 'pedido_form.php?error=' . $error_message;
        if ($id) {
            $redirect_url .= '&id=' . $id;
        }
        header('Location: ' . $redirect_url);
        exit;
    }

    if (empty($dni) || empty($nombre_completo) || empty($celular) || empty($sede_envio) || empty($producto) || $cantidad === false || $monto_total === false) {
        die('Por favor, complete todos los campos obligatorios.');
    }

    $monto_debe = $monto_total - $monto_adelantado;

    $params = [
        'dni_cliente' => $dni,
        'nombre_completo' => $nombre_completo,
        'celular' => $celular,
        'sede_envio' => $sede_envio,
        'codigo_rastreo' => $codigo_rastreo,
        'codigo_tracking' => $codigo_tracking,
        'clave' => $clave,
        'producto' => $producto,
        'cantidad' => $cantidad,
        'monto_total' => $monto_total,
        'monto_adelantado' => $monto_adelantado,
        'numero_operacion' => $numero_operacion,
        'monto_debe' => $monto_debe,
        'estado' => $estado,
        'notas' => $notas,
        'voucher_adelanto_path' => $voucher_adelanto_path,
        'voucher_restante_path' => $voucher_restante_path
    ];

    if ($id) {
        // UPDATE: Explicit and safe query
        $user_role = $_SESSION['user_role'] ?? '';

        $sql_parts = [
            "dni_cliente = :dni_cliente",
            "nombre_completo = :nombre_completo",
            "celular = :celular",
            "sede_envio = :sede_envio",
            "codigo_rastreo = :codigo_rastreo",
            "codigo_tracking = :codigo_tracking",
            "clave = :clave",
            "producto = :producto",
            "cantidad = :cantidad",
            "monto_total = :monto_total",
            "monto_adelantado = :monto_adelantado",
            "numero_operacion = :numero_operacion",
            "monto_debe = :monto_debe",
            "estado = :estado",
            "notas = :notas",
            "voucher_adelanto_path = :voucher_adelanto_path",
            "voucher_restante_path = :voucher_restante_path"
        ];

        // Conditionally add fecha_completado
        $completed_states = ['Completado', 'COMPLETADO ✅'];
        if (in_array($estado, $completed_states)) {
            // Only set fecha_completado if it hasn't been set before.
            $stmt_check = $pdo->prepare("SELECT fecha_completado FROM pedidos WHERE id = ?");
            $stmt_check->execute([$id]);
            $current_fecha_completado = $stmt_check->fetchColumn();
            if ($current_fecha_completado === null) {
                $sql_parts[] = "fecha_completado = NOW()";
            }
        }

        // Conditionally add asesor_id
        if ($user_role === 'Administrador' && !empty($_POST['asesor_id'])) {
            $sql_parts[] = "asesor_id = :asesor_id";
            $params['asesor_id'] = $_POST['asesor_id'];
        }

        $sql = "UPDATE pedidos SET " . implode(", ", $sql_parts) . " WHERE id = :id";

        $params['id'] = $id;
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
    } else {
        // INSERT: The advisor is the user creating the order.
        $params['asesor_id'] = $_SESSION['user_id'];

        $columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, codigo_rastreo, codigo_tracking, clave, producto, cantidad, monto_total, monto_adelantado, numero_operacion, monto_debe, estado, asesor_id, notas, voucher_adelanto_path, voucher_restante_path";
        $values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :monto_debe, :estado, :asesor_id, :notas, :voucher_adelanto_path, :voucher_restante_path";
        
        $completed_states = ['Completado', 'COMPLETADO ✅'];
        if (in_array($estado, $completed_states)) {
            $columns_sql .= ", fecha_completado";
            $values_sql .= ", :fecha_completado";
            $params['fecha_completado'] = date('Y-m-d H:i:s');
        }

        $sql = "INSERT INTO pedidos ($columns_sql) VALUES ($values_sql)";
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
    }

    if (isset($_POST['id']) && !empty($_POST['id'])) {
        // Si se está editando un pedido, redirigir a la página de referencia o a la lista general.
        $redirect_url = $_POST['referer'] ?? 'pedidos.php';
    } else {
        // Si se está creando un nuevo pedido, redirigir al formulario con un mensaje de éxito.
        $redirect_url = 'pedido_form.php?success=1';
    }
    header('Location: ' . $redirect_url);
    exit;

} else {
    header('Location: pedidos.php');
    exit;
}