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

try {
    $input = json_decode(file_get_contents('php://input') ?: ($GLOBALS['MOCK_INPUT'] ?? ''), true);

    if (!$input || !isset($input['NombreComercial']) || (!isset($input['presentaciones']) && !isset($input['FactorCaja']))) {
        throw new Exception('Faltan datos obligatorios para el registro');
    }

    $pdo = getConnection();
    $pdo->beginTransaction();

    $nombreCom = trim($input['NombreComercial']);
    $fechaFacturaRaw = !empty($input['fecha_factura']) ? $input['fecha_factura'] : date('Y-m-d');

    // Función para normalizar fecha a YYYY-MM-DD
    $normalizarFecha = function($raw) {
        if (!$raw) return date('Y-m-d');
        // Caso DD-MM-YYYY o DD/MM/YYYY
        if (preg_match('/^(\d{1,2})[-|\/](\d{1,2})[-|\/](\d{4})$/', trim($raw), $m)) {
            return "{$m[3]}-" . str_pad($m[2], 2, '0', STR_PAD_LEFT) . "-" . str_pad($m[1], 2, '0', STR_PAD_LEFT);
        }
        // Caso YYYY-MM-DD (ya correcto, pero aseguramos padding)
        if (preg_match('/^(\d{4})[-|\/](\d{1,2})[-|\/](\d{1,2})/', trim($raw), $m)) {
            return "{$m[1]}-" . str_pad($m[2], 2, '0', STR_PAD_LEFT) . "-" . str_pad($m[3], 2, '0', STR_PAD_LEFT);
        }
        return date('Y-m-d');
    };

    $fechaFactura = $normalizarFecha($fechaFacturaRaw);
    
    // --- 0. Generar Código Interno Automático ---
    $prefijo = strtoupper(mb_substr($nombreCom, 0, 1));
    $stmtMax = $pdo->prepare("SELECT CodigoInterno FROM productos 
                             WHERE CodigoInterno LIKE :pref 
                             AND CodigoInterno REGEXP :regex
                             ORDER BY CAST(SUBSTRING(CodigoInterno, 2) AS UNSIGNED) DESC LIMIT 1");
    $stmtMax->execute([':pref' => $prefijo . '%', ':regex' => '^' . $prefijo . '[0-9]+$']);
    $ultimo = $stmtMax->fetch();
    
    if ($ultimo) {
        $numero = intval(substr($ultimo['CodigoInterno'], 1));
        $nuevoCodigo = $prefijo . str_pad($numero + 1, 4, '0', STR_PAD_LEFT);
    } else {
        $nuevoCodigo = $prefijo . "0001";
    }

    // --- 1. Insertar en tabla maestra: productos ---
    $sqlProd = "INSERT INTO productos (
                    CodigoInterno, CodigoBarra, NombreComercial, NombreGenerico, 
                    laboratorio, exento_iva, estado, receta_controlada, requiere_receta, receta_requerida
                ) VALUES (
                    :cod_int, :cod_bar, :nom_com, :nom_gen,
                    :lab, :exento, 1, 0, 0, 0
                )";
    
    $existencia = intval($input['existencia'] ?? 0);
    $exento = !empty($input['exento_iva']) ? 1 : 0;
    
    $c_unidad = floatval($input['CostoUnidad'] ?? 0);

    $stmtProd = $pdo->prepare($sqlProd);
    $stmtProd->execute([
        ':cod_int'   => $nuevoCodigo,
        ':cod_bar'   => $input['CodigoBarra'] ?? '',
        ':nom_com'   => $nombreCom,
        ':nom_gen'   => $input['NombreGenerico'] ?? null,
        ':lab'       => $input['laboratorio'] ?? null,
        ':exento'    => $exento
    ]);
    
    $pid = $pdo->lastInsertId();

    // --- 2. Registrar Mapeo FEL ---
    if (!empty($input['descripcion_factura'])) {
        $stmtMap = $pdo->prepare("INSERT INTO fel_producto_mapping (descripcion_factura, producto_id) VALUES (:desc, :pid)");
        $stmtMap->execute([
            ':desc' => trim($input['descripcion_factura']),
            ':pid'  => $pid
        ]);
    }

    // --- 3. Registrar Presentaciones (Dinámico) ---
    $stmtPres = $pdo->prepare("
        INSERT INTO producto_presentaciones 
        (producto_id, presentacion_id, factor_conversion, activo, es_unidad_base, 
         precio_venta, es_facturable, es_comprable, es_vendible, fecha_creacion, orden) 
        VALUES (?, ?, ?, ?, ?, ?, 1, 1, 1, NOW(), ?)"
    );

    if (!empty($input['presentaciones']) && is_array($input['presentaciones'])) {
        // New dynamic format: array of { presentacion_id, factor_conversion, precio_venta, es_unidad_base, activo }
        $orden = 1;
        foreach ($input['presentaciones'] as $pres) {
            $stmtPres->execute([
                $pid,
                intval($pres['presentacion_id']),
                intval($pres['factor_conversion']),
                intval($pres['activo'] ?? 1),
                intval($pres['es_unidad_base'] ?? 0),
                floatval($pres['precio_venta'] ?? 0),
                $orden
            ]);
            $orden++;
        }
    } else {
        // Legacy fallback: fixed FactorCaja/FactorBlister format
        $f_blister = intval($input['FactorBlister'] ?? 1);
        $f_caja = intval($input['FactorCaja'] ?? 1);
        
        $stmtPres->execute([$pid, 1, 1, 1, 1, floatval($input['PrecioVentaUnidad'] ?? 0), 1]);
        if ($f_blister > 1) {
            $stmtPres->execute([$pid, 2, $f_blister, 1, 0, floatval($input['PrecioVentaBlister'] ?? 0), 2]);
        }
        if ($f_caja > 1) {
            $stmtPres->execute([$pid, 3, $f_caja, 1, 0, floatval($input['PrecioVentaMayor'] ?? 0), 3]);
        }
    }

    // --- 4. Registrar Lugar de Compra (solo el seleccionado por el usuario) ---
    $lugarId = !empty($input['id_lugarCompra']) ? intval($input['id_lugarCompra']) : 1;
    
    $stmtLugar = $pdo->prepare(
        "INSERT INTO producto_lugares_compra
         (producto_id, lugar_compra_id, costo_compra, fecha_ultima_compra, fecha_vencimiento, con_factura, exento_iva, activo)
         VALUES (?, ?, ?, ?, ?, ?, ?, 1)"
    );

    $stmtLugar->execute([
        $pid, $lugarId, $c_unidad, $fechaFactura,
        !empty($input['FechaVencimiento']) ? $normalizarFecha($input['FechaVencimiento']) : null,
        !empty($input['conFactura']) ? 1 : 0, $exento
    ]);

    // --- 5. Inicializar Inventario de Sucursal (Sucursal 1) ---
    if ($existencia > 0) {
        $conFactura = !empty($input['conFactura']) ? 1 : 0;
        $stockFact = $conFactura ? $existencia : 0;
        $stockNoFact = $conFactura ? 0 : $existencia;
        
        $stmtInv = $pdo->prepare("
            INSERT INTO inventario_sucursal 
            (producto_id, sucursal_id, stock_total, stock_facturado, stock_no_facturado, costo_promedio_local)
            VALUES (?, 1, ?, ?, ?, ?)
        ");
        $stmtInv->execute([$pid, $existencia, $stockFact, $stockNoFact, $c_unidad]);
    }

    // --- 6. Inicializar Costo Promedio (CPP) ---
    $valorTotal = round($c_unidad * $existencia, 2);
    $stmtCPP = $pdo->prepare("
        INSERT INTO productos_costo_promedio 
        (producto_id, costo_promedio_unidad_base, cantidad_total_unidades, valor_total_inventario)
        VALUES (?, ?, ?, ?)
    ");
    $stmtCPP->execute([$pid, $c_unidad, $existencia, $valorTotal]);

    // --- 7. Registrar Historial en Bitácora de Compra ---
    if ($existencia > 0 && $c_unidad > 0) {
        $stmtC = $pdo->prepare("INSERT INTO compras (fecha_compra, id_lugarCompra, total, tipo_pago, estado_pago) VALUES (?, ?, ?, 'contado', 'pendiente')");
        $stmtC->execute([$fechaFactura, $lugarId, $c_unidad * $existencia]);
        $compraId = $pdo->lastInsertId();

        $stmtD = $pdo->prepare("INSERT INTO compras_detalle (compra_id, producto_id, cantidad, costo_unitario, costo_total, fecha_vencimiento) VALUES (?, ?, ?, ?, ?, ?)");
        $stmtD->execute([$compraId, $pid, $existencia, $c_unidad, $c_unidad * $existencia, !empty($input['FechaVencimiento']) ? $normalizarFecha($input['FechaVencimiento']) : null]);
    }

    $pdo->commit();
    echo json_encode([
        'success' => true, 
        'message' => 'Producto registrado exitosamente en catálogo e inventario centralizado',
        'data' => [
            'id' => $pid,
            'CodigoInterno' => $nuevoCodigo,
            'NombreComercial' => $nombreCom
        ]
    ]);

} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) $pdo->rollBack();
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
