<?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_rel = 'assets/uploads/vouchers/';
        $upload_dir_abs = __DIR__ . '/' . $upload_dir_rel;

        if (!is_dir($upload_dir_abs)) {
            mkdir($upload_dir_abs, 0775, true);
        }

        $filename = uniqid() . '-' . basename($_FILES[$file_key]['name']);
        $path_abs = $upload_dir_abs . $filename;
        $path_rel = $upload_dir_rel . $filename;

        // Move first; only delete the previous file after a successful upload.
        if (move_uploaded_file($_FILES[$file_key]['tmp_name'], $path_abs)) {
            if (!empty($current_path)) {
                $current_abs = __DIR__ . '/' . $current_path;
                if (file_exists($current_abs)) {
                    unlink($current_abs);
                }
            }
            return $path_rel;
        }

        // Upload failed: keep the previous path (if any)
        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']);
    $agencia = trim($_POST['agencia'] ?? 'SHALOM');
    $sede_envio = trim($_POST['sede_envio']);
    $codigo_rastreo = trim($_POST['codigo_rastreo'] ?? '');
    $codigo_tracking = trim($_POST['codigo_tracking'] ?? '');
    $clave = trim($_POST['clave'] ?? '');
    $pendientes = trim($_POST['pendientes'] ?? '');
    

    // --- 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']);
    $banco = trim($_POST['banco'] ?? '');
    $estado = $_POST['estado'];
    $notas = trim($_POST['notas']);
    $nota_adicional = trim($_POST['nota_adicional'] ?? '');
    $observacion = trim($_POST['observacion'] ?? '');
    $descargo = trim($_POST['descargo'] ?? '');

    // Obtener costos predeterminados de la configuración
    $stmt_config = $pdo->query("SELECT clave, valor FROM configuracion_costos");
    $config = $stmt_config->fetchAll(PDO::FETCH_KEY_PAIR);

    // Solo asignamos valores de config si es un pedido nuevo y no vienen en el POST
    if (!$id) {
        $comision_vendedora = $config['comision_venta'] ?? 0;
        $costo_envio_real = ($agencia === 'SHALOM' || $agencia === 'OLVA') ? ($config['envio_agencia'] ?? 0) : ($config['envio_contraentrega'] ?? 0);
        $gasto_publicidad_unitario = 0; // Opcional: podrías calcular publicidad_diaria / pedidos_del_dia
    } else {
        // Si es edición, intentamos capturar del POST por si acaso, si no, se manejará en el SQL dinámico
        $comision_vendedora = isset($_POST['comision_vendedora']) ? filter_var($_POST['comision_vendedora'], FILTER_VALIDATE_FLOAT) : null;
        $costo_envio_real = isset($_POST['costo_envio_real']) ? filter_var($_POST['costo_envio_real'], FILTER_VALIDATE_FLOAT) : null;
        $gasto_publicidad_unitario = isset($_POST['gasto_publicidad_unitario']) ? filter_var($_POST['gasto_publicidad_unitario'], FILTER_VALIDATE_FLOAT) : null;
    }

    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;
    }

    // Check for minimum length of operation number
    if (!empty($numero_operacion) && strlen($numero_operacion) < 6) {
        $error_message = urlencode("El número de operación debe tener al menos 6 dígitos.");
        $redirect_url = 'pedido_form.php?error=' . $error_message;
        if ($id) {
            $redirect_url .= '&id=' . $id;
        }
        header('Location: ' . $redirect_url);
        exit;
    }

    // Check for duplicate operation number
    if (!empty($numero_operacion)) {
        $check_sql = "SELECT id FROM pedidos WHERE numero_operacion = ? AND id != ?";
        $check_stmt = $pdo->prepare($check_sql);
        $check_stmt->execute([$numero_operacion, $id ?? 0]);
        $duplicate = $check_stmt->fetch();
        if ($duplicate) {
            $error_message = urlencode("El número de operación ya existe en el pedido #" . $duplicate['id']);
            $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,
        'agencia' => $agencia,
        'sede_envio' => $sede_envio,
        'codigo_rastreo' => $codigo_rastreo,
        'codigo_tracking' => $codigo_tracking,
        'clave' => $clave,
        'pendientes' => $pendientes,
        
        'producto' => $producto,
        'cantidad' => $cantidad,
        'monto_total' => $monto_total,
        'monto_adelantado' => $monto_adelantado,
        'numero_operacion' => $numero_operacion,
        'banco' => $banco,
        'monto_debe' => $monto_debe,
        'estado' => $estado,
        'notas' => $notas,
        'nota_adicional' => $nota_adicional,
        'observacion' => $observacion,
        'descargo' => $descargo,
        'comision_vendedora' => $comision_vendedora,
        'costo_envio_real' => $costo_envio_real,
        'gasto_publicidad_unitario' => $gasto_publicidad_unitario,
        '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",
            "agencia = :agencia",
            "sede_envio = :sede_envio",
            "codigo_rastreo = :codigo_rastreo",
            "codigo_tracking = :codigo_tracking",
            "clave = :clave",
            "pendientes = :pendientes",
            
            "producto = :producto",
            "cantidad = :cantidad",
            "monto_total = :monto_total",
            "monto_adelantado = :monto_adelantado",
            "numero_operacion = :numero_operacion",
            "banco = :banco",
            "monto_debe = :monto_debe",
            "estado = :estado",
            "notas = :notas",
            "nota_adicional = :nota_adicional",
            "observacion = :observacion",
            "descargo = :descargo",
            "voucher_adelanto_path = :voucher_adelanto_path",
            "voucher_restante_path = :voucher_restante_path"
        ];

        if ($comision_vendedora !== null) {
            $sql_parts[] = "comision_vendedora = :comision_vendedora";
        } else {
            unset($params['comision_vendedora']);
        }
        if ($costo_envio_real !== null) {
            $sql_parts[] = "costo_envio_real = :costo_envio_real";
        } else {
            unset($params['costo_envio_real']);
        }
        if ($gasto_publicidad_unitario !== null) {
            $sql_parts[] = "gasto_publicidad_unitario = :gasto_publicidad_unitario";
        } else {
            unset($params['gasto_publicidad_unitario']);
        }

        // 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()";
                
                // --- NEW: Insert into operaciones_provincia ---
                $stmt_p = $pdo->prepare("SELECT p.*, u.nombre_asesor FROM pedidos p LEFT JOIN users u ON p.asesor_id = u.id WHERE p.id = ?");
                $stmt_p->execute([$id]);
                $p_data = $stmt_p->fetch(PDO::FETCH_ASSOC);
                
                if ($p_data) {
                    $stmt_op = $pdo->prepare("INSERT INTO operaciones_provincia (pedido_id, cliente, celular, producto, monto_total, monto_debe, nro_operacion, banco, fecha_completado, asesor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?)");
                    $stmt_op->execute([
                        $id,
                        $p_data['nombre_completo'],
                        $p_data['celular'],
                        $p_data['producto'],
                        $p_data['monto_total'],
                        $p_data['monto_debe'],
                        $numero_operacion,
                        $banco,
                        $p_data['nombre_asesor']
                    ]);
                }
                // --- End of NEW ---
            }
        }

        // Conditionally add asesor_id
        if (($user_role === 'Administrador' || $user_role === 'Logistica') && !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, agencia, sede_envio, codigo_rastreo, codigo_tracking, clave, pendientes, producto, cantidad, monto_total, monto_adelantado, numero_operacion, banco, monto_debe, estado, asesor_id, notas, nota_adicional, observacion, descargo, comision_vendedora, costo_envio_real, gasto_publicidad_unitario, voucher_adelanto_path, voucher_restante_path";
        $values_sql = ":dni_cliente, :nombre_completo, :celular, :agencia, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :pendientes, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :banco, :monto_debe, :estado, :asesor_id, :notas, :nota_adicional, :observacion, :descargo, :comision_vendedora, :costo_envio_real, :gasto_publicidad_unitario, :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);
        $new_id = $pdo->lastInsertId();

        // --- NEW: Insert into operaciones_provincia if completed ---
        if (in_array($estado, $completed_states)) {
            $stmt_u = $pdo->prepare("SELECT nombre_asesor FROM users WHERE id = ?");
            $stmt_u->execute([$_SESSION['user_id']]);
            $nombre_asesor = $stmt_u->fetchColumn();

            $stmt_op = $pdo->prepare("INSERT INTO operaciones_provincia (pedido_id, cliente, celular, producto, monto_total, monto_debe, nro_operacion, banco, fecha_completado, asesor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?)");
            $stmt_op->execute([
                $new_id,
                $nombre_completo,
                $celular,
                $producto,
                $monto_total,
                $monto_debe,
                $numero_operacion,
                $banco,
                $nombre_asesor
            ]);
        }
        // --- End of NEW ---
    }

    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.
        $referer = $_POST['referer'] ?? '';
        if (is_string($referer) && strpos($referer, 'embed=1') !== false) {
            $redirect_url = 'pedido_form.php?success=1&embed=1';
        } else {
            $redirect_url = 'pedido_form.php?success=1';
        }
    }
    header('Location: ' . $redirect_url);
    exit;

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