<?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) {

        case 'tipos':
            json_success([
                ['id'=>'PERDIDA','label'=>'Pérdida','icon'=>'bi-archive','color'=>'#ef4444','desc'=>'Merma de inventario sin causa específica'],
                ['id'=>'DANO','label'=>'Daño','icon'=>'bi-bug','color'=>'#f97316','desc'=>'Producto dañado o en mal estado'],
                ['id'=>'VENCIMIENTO','label'=>'Vencimiento','icon'=>'bi-calendar-x','color'=>'#eab308','desc'=>'Producto vencido'],
                ['id'=>'ROBO','label'=>'Robo/Hurto','icon'=>'bi-shield-exclamation','color'=>'#dc2626','desc'=>'Pérdida por robo o hurto'],
                ['id'=>'SOBRANTE','label'=>'Sobrante','icon'=>'bi-plus-circle','color'=>'#22c55e','desc'=>'Producto sobrante encontrado en inventario'],
                ['id'=>'CORRECCION_POSITIVA','label'=>'Corrección (+)', 'icon'=>'bi-arrow-up-circle','color'=>'#10b981','desc'=>'Ajuste manual para aumentar stock'],
                ['id'=>'CORRECCION_NEGATIVA','label'=>'Corrección (-)', 'icon'=>'bi-arrow-down-circle','color'=>'#ef4444','desc'=>'Ajuste manual para disminuir stock'],
            ]);
            break;

        case 'productos_buscar':
            $q = $_GET['q'] ?? '';
            $sucursal_id = intval($_GET['sucursal_id'] ?? 0);
            $params = [];
            $where = "p.estado=1";
            if ($q) {
                $l = "%$q%";
                $where .= " AND (p.NombreComercial LIKE ? OR p.CodigoInterno LIKE ? OR p.CodigoBarra LIKE ?)";
                $params = array_merge($params, [$l,$l,$l]);
            }

            if ($sucursal_id) {
                $sql = "SELECT p.id, p.NombreComercial as producto, p.CodigoInterno as codigo, p.CodigoBarra as barra,
                        c.nombre as categoria,
                        COALESCE(inv.stock_total,0) as stock_total,
                        COALESCE(inv.stock_facturado,0) as stock_facturado,
                        COALESCE(inv.stock_no_facturado,0) as stock_no_facturado,
                        COALESCE(inv.costo_promedio_local,0) as costo_promedio_local,
                        ? as sucursal_id,
                        COALESCE(s.nombre,'') as sucursal_nombre
                    FROM productos p
                    LEFT JOIN categorias c ON c.id=p.id_categoria
                    LEFT JOIN inventario_sucursal inv ON inv.producto_id=p.id AND inv.sucursal_id=?
                    LEFT JOIN sucursales s ON s.id=?
                    WHERE $where";
                array_unshift($params, $sucursal_id, $sucursal_id, $sucursal_id);
            } else {
                $sql = "SELECT p.id, p.NombreComercial as producto, p.CodigoInterno as codigo, p.CodigoBarra as barra,
                        c.nombre as categoria,
                        SUM(COALESCE(inv.stock_total,0)) as stock_total,
                        SUM(COALESCE(inv.stock_facturado,0)) as stock_facturado,
                        SUM(COALESCE(inv.stock_no_facturado,0)) as stock_no_facturado,
                        AVG(COALESCE(inv.costo_promedio_local,0)) as costo_promedio_local,
                        0 as sucursal_id, '' as sucursal_nombre
                    FROM productos p
                    LEFT JOIN categorias c ON c.id=p.id_categoria
                    LEFT JOIN inventario_sucursal inv ON inv.producto_id=p.id
                    WHERE $where
                    GROUP BY p.id";
            }
            $sql .= " ORDER BY stock_total DESC, p.NombreComercial ASC LIMIT 50";
            $s = $pdo->prepare($sql);
            $s->execute($params);
            json_success($s->fetchAll());
            break;

        case 'crear':
            $d = json_input();
            require_fields($d, ['producto_id','sucursal_id','tipo_ajuste','cantidad','motivo']);
            $producto_id = intval($d['producto_id']);
            $sucursal_id = intval($d['sucursal_id']);
            $tipo = $d['tipo_ajuste'];
            $cantidad = intval($d['cantidad']);
            $motivo = trim($d['motivo']);
            $presentacion = $d['presentacion'] ?? 'UNIDAD';
            $usuario_id = intval($d['usuario_id'] ?? 0);
            $autorizado_por = intval($d['autorizado_por'] ?? $usuario_id);

            if ($cantidad <= 0) json_error('La cantidad debe ser mayor a 0');
            if (!$motivo) json_error('El motivo es requerido');

            // Validate quantity limit for negative adjustments
            $inv = $pdo->prepare("SELECT stock_total, stock_facturado, stock_no_facturado, costo_promedio_local FROM inventario_sucursal WHERE producto_id=? AND sucursal_id=?");
            $inv->execute([$producto_id, $sucursal_id]);
            $stock_actual = $inv->fetch();

            $stock_total_actual = $stock_actual ? intval($stock_actual['stock_total']) : 0;
            $costo_ref = $stock_actual ? floatval($stock_actual['costo_promedio_local']) : 0;

            $tipos_restan = ['PERDIDA','DANO','VENCIMIENTO','ROBO','CORRECCION_NEGATIVA'];
            $tipos_suman = ['SOBRANTE','CORRECCION_POSITIVA'];

            if (in_array($tipo, $tipos_restan) && $cantidad > $stock_total_actual) {
                // Allow adjustment to be up to stock, but cap it
                $cantidad = min($cantidad, $stock_total_actual);
                if ($cantidad <= 0) json_error('No hay stock suficiente para este ajuste');
            }

            $cantidad_ajustada = in_array($tipo, $tipos_suman) ? $cantidad : -$cantidad;
            $afecta_facturado = 1;

            $pdo->beginTransaction();

            // Insert into ajustes_inventario
            $ins = $pdo->prepare("INSERT INTO ajustes_inventario (producto_id, sucursal_id, tipo_ajuste, cantidad_ajustada, presentacion, afecta_facturado, costo_unitario_referencia, motivo, usuario_id, autorizado_por) VALUES (?,?,?,?,?,?,?,?,?,?)");
            $ins->execute([$producto_id, $sucursal_id, $tipo, $cantidad_ajustada, $presentacion, $afecta_facturado, $costo_ref, $motivo, $usuario_id, $autorizado_por]);
            $ajuste_id = intval($pdo->lastInsertId());

            // Update inventario_sucursal
            if ($stock_actual) {
                $nuevo_total = max(0, $stock_total_actual + $cantidad_ajustada);
                $pdo->prepare("UPDATE inventario_sucursal SET stock_total=?, stock_facturado=GREATEST(0,CAST(stock_facturado AS SIGNED)+?), last_updated=NOW() WHERE producto_id=? AND sucursal_id=?")
                    ->execute([$nuevo_total, $cantidad_ajustada>0?$cantidad:min($cantidad_ajustada, -$stock_actual['stock_facturado']), $producto_id, $sucursal_id]);
            } else {
                $pdo->prepare("INSERT INTO inventario_sucursal (producto_id, sucursal_id, stock_total, stock_facturado) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE stock_total=stock_total+VALUES(stock_total), stock_facturado=stock_facturado+VALUES(stock_facturado)")
                    ->execute([$producto_id, $sucursal_id, $cantidad, $cantidad]);
            }

            // Record in movimientos_inventario (audit)
            $stock_antes = $stock_total_actual;
            $stock_despues = max(0, $stock_total_actual + $cantidad_ajustada);
            $ins_mov = $pdo->prepare("INSERT INTO movimientos_inventario (producto_id, sucursal_id, tipo_movimiento, cantidad, presentacion, facturado, costo_unitario, stock_antes, stock_despues, referencia_id, referencia_tipo, usuario_id, observaciones, fecha_movimiento) VALUES (?,?,'AJUSTE',?,?,?,?,?,?,?,?,?,?,NOW())");
            $ins_mov->execute([$producto_id, $sucursal_id, $cantidad_ajustada, $presentacion, $afecta_facturado, $costo_ref, $stock_antes, $stock_despues, $ajuste_id, 'ajuste_inventario', $usuario_id, $motivo]);

            // Also record in legacy inventario_movimientos
            $tipo_mov = $cantidad_ajustada > 0 ? 'ajuste_auditoria_suma' : 'ajuste_auditoria_resta';
            $ins_legacy = $pdo->prepare("INSERT INTO inventario_movimientos (producto_id, sucursal_id, tipo_movimiento, cantidad, saldo_despues, referencia_id, justificacion, usuario_id, fecha_movimiento) VALUES (?,?,?,?,?,?,?,?,NOW())");
            $justificacion_kardex = $motivo . " (" . ($afecta_facturado ? 'Facturado' : 'Sin Factura') . ")";
            $ins_legacy->execute([$producto_id, $sucursal_id, $tipo_mov, abs($cantidad_ajustada), $stock_despues, 'AJUSTE#'.$ajuste_id, $justificacion_kardex, $usuario_id]);

            $pdo->commit();

            json_success(['id'=>$ajuste_id, 'tipo'=>$tipo, 'cantidad_ajustada'=>$cantidad_ajustada, 'stock_anterior'=>$stock_antes, 'stock_nuevo'=>$stock_despues], 'Ajuste registrado');
            break;

        case 'listar':
            $page = max(1, intval($_GET['page']??1));
            $limit = 50;
            $offset = ($page-1)*$limit;
            $where = []; $params = [];
            if (!empty($_GET['sucursal_id'])) { $where[]="a.sucursal_id=?"; $params[]=intval($_GET['sucursal_id']); }
            if (!empty($_GET['tipo'])) { $where[]="a.tipo_ajuste=?"; $params[]=$_GET['tipo']; }
            if (!empty($_GET['fecha_desde'])) { $where[]="DATE(a.fecha_ajuste)>=?"; $params[]=$_GET['fecha_desde']; }
            if (!empty($_GET['fecha_hasta'])) { $where[]="DATE(a.fecha_ajuste)<=?"; $params[]=$_GET['fecha_hasta']; }
            $w = $where ? 'WHERE '.implode(' AND ', $where) : '';
            $total = $pdo->prepare("SELECT COUNT(*) FROM ajustes_inventario a $w");
            $total->execute($params);
            $total = intval($total->fetchColumn());

            $s = $pdo->prepare("SELECT a.*, p.NombreComercial as producto, p.CodigoInterno as codigo,
                    s.nombre as sucursal, u.nombre as usuario, au.nombre as autorizado_por_nombre
                FROM ajustes_inventario a
                JOIN productos p ON p.id=a.producto_id
                JOIN sucursales s ON s.id=a.sucursal_id
                LEFT JOIN usuarios u ON u.id=a.usuario_id
                LEFT JOIN usuarios au ON au.id=a.autorizado_por
                $w ORDER BY a.fecha_ajuste DESC LIMIT $limit OFFSET $offset");
            $s->execute($params);
            json_success([
                'data'=>$s->fetchAll(),
                'total'=>$total,
                'page'=>$page,
                'pages'=>ceil($total/$limit)
            ]);
            break;

        case 'detalle':
            $id = intval($_GET['id']??0);
            $s = $pdo->prepare("SELECT a.*, p.NombreComercial as producto, p.CodigoInterno as codigo,
                    s.nombre as sucursal, u.nombre as usuario, au.nombre as autorizado_por_nombre
                FROM ajustes_inventario a
                JOIN productos p ON p.id=a.producto_id
                JOIN sucursales s ON s.id=a.sucursal_id
                LEFT JOIN usuarios u ON u.id=a.usuario_id
                LEFT JOIN usuarios au ON au.id=a.autorizado_por
                WHERE a.id=?");
            $s->execute([$id]);
            $r = $s->fetch();
            if (!$r) json_error('Ajuste no encontrado');
            json_success($r);
            break;

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