<?php
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../includes/helpers.php';

$pdo = getConnection();
$action = $_GET['action'] ?? '';

try {
    switch ($action) {

        // Products in BodegaCentral (sucursal 1) with stock > 0
        case 'productos_bodega':
            $q = $_GET['q'] ?? '';
            $sql = "SELECT inv.producto_id, p.NombreComercial as producto, p.CodigoInterno as codigo,
                    p.CodigoBarra as barra, c.nombre as categoria, inv.stock_total,
                    inv.stock_facturado, inv.stock_no_facturado, inv.costo_promedio_local,
                    inv.stock_minimo
                FROM inventario_sucursal inv
                JOIN productos p ON p.id=inv.producto_id
                LEFT JOIN categorias c ON c.id=p.id_categoria
                WHERE inv.sucursal_id=1 AND inv.stock_total > 0";
            if ($q) {
                $sql .= " AND (p.NombreComercial LIKE ? OR p.CodigoInterno LIKE ? OR p.CodigoBarra LIKE ?)";
                $like = "%$q%";
                $stmt = $pdo->prepare("$sql ORDER BY p.NombreComercial LIMIT 100");
                $stmt->execute([$like, $like, $like]);
            } else {
                $stmt = $pdo->query("$sql ORDER BY inv.stock_total DESC LIMIT 200");
            }
            json_success($stmt->fetchAll());
            break;

        // Branches except Bodega
        case 'sucursales':
            $stmt = $pdo->query("SELECT id, nombre FROM sucursales WHERE id != 1 ORDER BY id");
            json_success($stmt->fetchAll());
            break;

        // Execute distribution from Bodega to branches
        case 'distribuir':
            $d = json_input();
            require_fields($d, ['producto_id', 'distribucion']);
            $producto_id = intval($d['producto_id']);
            $distribucion = $d['distribucion']; // array of {sucursal_id, cantidad}
            $presentacion_id = intval($d['presentacion_id'] ?? 1);
            $usuario_id = intval($d['usuario_id'] ?? 0);

            // Get factor conversion
            $fac = $pdo->prepare("SELECT factor_conversion FROM producto_presentaciones WHERE producto_id=? AND presentacion_id=? LIMIT 1");
            $fac->execute([$producto_id, $presentacion_id]);
            $f = $fac->fetch();
            $factor = $f ? max(1, intval($f['factor_conversion'])) : 1;

            // Validate total <= bodega stock
            $inv = $pdo->prepare("SELECT stock_total, stock_facturado, stock_no_facturado FROM inventario_sucursal WHERE producto_id=? AND sucursal_id=1");
            $inv->execute([$producto_id]);
            $bodega = $inv->fetch();
            if (!$bodega) json_error('Producto no encontrado en Bodega');

            $total_dist = 0;
            foreach ($distribucion as &$item) {
                $item['cantidad'] = max(0, intval($item['cantidad']));
                $item['unidades_base'] = $item['cantidad'] * $factor;
                $total_dist += $item['unidades_base'];
            }
            unset($item);

            if ($total_dist <= 0) json_error('Debe distribuir al menos 1 unidad');
            if ($total_dist > intval($bodega['stock_total'])) json_error('No hay suficiente stock en Bodega (disponible: '.$bodega['stock_total'].')');

            // Determine facturado ratio
            $ratio_f = intval($bodega['stock_total']) > 0 ? intval($bodega['stock_facturado']) / intval($bodega['stock_total']) : 0;

            $pdo->beginTransaction();

            foreach ($distribucion as $item) {
                if ($item['cantidad'] <= 0) continue;
                $suc_id = intval($item['sucursal_id']);
                $ubs = $item['unidades_base'];
                if ($suc_id == 1) continue;

                // Create traslado
                $str = $pdo->prepare("INSERT INTO traslados (sucursal_origen, sucursal_destino, usuario_id, estado, fecha_traslado, observaciones) VALUES (1,?,?,'completado',NOW(),'Distribución desde Bodega')");
                $str->execute([$suc_id, $usuario_id]);
                $traslado_id = intval($pdo->lastInsertId());

                // Detalle traslado
                $sdet = $pdo->prepare("INSERT INTO detalle_traslados (traslado_id, producto_id, presentacion_id, cantidad, cantidad_unidades_base, es_facturado) VALUES (?,?,?,?,?,?)");
                $fact = round($ubs * $ratio_f);
                $sdet->execute([$traslado_id, $producto_id, $presentacion_id, $item['cantidad'], $ubs, $fact > 0 ? 1 : 0]);

                // Descontar Bodega
                $pdo->prepare("UPDATE inventario_sucursal SET
                    stock_total = GREATEST(0, CAST(stock_total AS SIGNED) - ?),
                    stock_facturado = GREATEST(0, CAST(stock_facturado AS SIGNED) - ?),
                    stock_no_facturado = GREATEST(0, CAST(stock_no_facturado AS SIGNED) - (? - ?))
                    WHERE producto_id=? AND sucursal_id=1")
                    ->execute([$ubs, $fact, $ubs, $fact, $producto_id]);

                // Sumar a sucursal destino
                $nf = $ubs - $fact;
                $pdo->prepare("INSERT INTO inventario_sucursal (producto_id, sucursal_id, stock_total, stock_facturado, stock_no_facturado, costo_promedio_local)
                    VALUES (?,?,?,?,?,?)
                    ON DUPLICATE KEY UPDATE
                        stock_total = stock_total + VALUES(stock_total),
                        stock_facturado = stock_facturado + VALUES(stock_facturado),
                        stock_no_facturado = stock_no_facturado + VALUES(stock_no_facturado)")
                    ->execute([$producto_id, $suc_id, $ubs, $fact, $nf, $bodega['costo_promedio_local'] ?? 0]);
            }

            $pdo->commit();
            json_success(['total_unidades' => $total_dist], 'Distribución completada');
            break;

        // Distribution history
        case 'historial':
            $limit = min(500, max(1, intval($_GET['limit'] ?? 100)));
            $offset = max(0, intval($_GET['offset'] ?? 0));
            $q = "SELECT t.id, t.fecha_traslado, t.sucursal_origen, t.sucursal_destino,
                    so.nombre as origen, sd.nombre as destino, t.usuario_id, u.nombre as usuario,
                    t.estado, t.observaciones,
                    dt.producto_id, p.NombreComercial as producto, p.CodigoInterno as codigo,
                    dt.cantidad, dt.cantidad_unidades_base, pr.nombre as presentacion
                FROM traslados t
                JOIN detalle_traslados dt ON dt.traslado_id=t.id
                JOIN productos p ON p.id=dt.producto_id
                JOIN sucursales so ON so.id=t.sucursal_origen
                JOIN sucursales sd ON sd.id=t.sucursal_destino
                LEFT JOIN presentaciones pr ON pr.id=dt.presentacion_id
                LEFT JOIN usuarios u ON u.id=t.usuario_id
                WHERE t.sucursal_origen=1
                ORDER BY t.fecha_traslado DESC
                LIMIT $limit OFFSET $offset";
            $rows = $pdo->query($q)->fetchAll();
            // Group by traslado_id
            $hist = [];
            foreach ($rows as $r) {
                $tid = $r['id'];
                if (!isset($hist[$tid])) {
                    $hist[$tid] = [
                        'id' => $tid,
                        'fecha' => $r['fecha_traslado'],
                        'destino' => $r['destino'],
                        'usuario' => $r['usuario'],
                        'estado' => $r['estado'],
                        'productos' => []
                    ];
                }
                $hist[$tid]['productos'][] = [
                    'producto' => $r['producto'],
                    'codigo' => $r['codigo'],
                    'cantidad' => $r['cantidad'],
                    'unidades_base' => $r['cantidad_unidades_base'],
                    'presentacion' => $r['presentacion']
                ];
            }
            json_success(array_values($hist));
            break;

        // Get product presentations
        case 'presentaciones_producto':
            $pid = intval($_GET['producto_id'] ?? 0);
            if (!$pid) json_error('Producto requerido');
            $s = $pdo->prepare("SELECT pp.id, pp.presentacion_id, pr.nombre, pp.factor_conversion, pp.precio_venta
                FROM producto_presentaciones pp JOIN presentaciones pr ON pr.id=pp.presentacion_id
                WHERE pp.producto_id=? AND pp.activo=1 ORDER BY pp.factor_conversion");
            $s->execute([$pid]);
            json_success($s->fetchAll());
            break;

        default:
            json_error('Accion no valida');
    }
} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) $pdo->rollBack();
    json_error('Error: '.$e->getMessage());
}
