<?php
/**
 * POST /api/productos/actualizar.php
 * Update a product field (inline editing)
 */
require_once '../../config/database.php';
require_once '../../includes/helpers.php';

require_post();
$data = json_input();
require_fields($data, ['id', 'field', 'value']);

$pdo = getConnection();

$id    = (int)$data['id'];
$field = $data['field'];
$value = $data['value'];

// Allowed fields whitelist
$allowed = [
    'CostoUnidad' => 'float', 'CostoBlister' => 'float', 'CostoMayor' => 'float', 'CostoMixto' => 'float',
    'PrecioVentaUnidad' => 'float', 'PrecioVentaBlister' => 'float', 'PrecioVentaMayor' => 'float', 'PrecioVentaMixto' => 'float',
    'NombreComercial' => 'string', 'NombreGenerico' => 'string', 'CodigoInterno' => 'string', 'CodigoBarra' => 'string',
    'laboratorio' => 'string', 'FuncionMedica' => 'string', 'FechaIngreso' => 'string', 'FechaVencimiento' => 'string',
    'exento_iva' => 'int', 'se_factura' => 'int', 'id_lugarCompra' => 'int', 'existencia' => 'int',
    'presentaciones_venta' => 'string', 'FactorBlister' => 'float', 'FactorCaja' => 'float',
    'receta_controlada' => 'int', 'id_categoria' => 'int',
];

try {
    if (!isset($allowed[$field])) {
        json_error("Campo no permitido: $field", 400);
    }

    $type = $allowed[$field];
    if ($type === 'float') $value = (float)$value;
    elseif ($type === 'int') $value = (int)$value;
    else $value = (string)$value;

    $affected = 0;

    // Routing field updates
    if (in_array($field, ['CostoUnidad', 'CostoBlister', 'CostoMayor', 'CostoMixto'])) {
        // Only CostoUnidad is effectively stored in the new schema as CPP
        if ($field === 'CostoUnidad') {
            $stmt = $pdo->prepare("UPDATE productos_costo_promedio SET costo_promedio_unidad_base = ?, valor_total_inventario = cantidad_total_unidades * ? WHERE producto_id = ?");
            $stmt->execute([$value, $value, $id]);
            if ($stmt->rowCount() == 0) {
                // Insert if not exists
                $stmt = $pdo->prepare("INSERT IGNORE INTO productos_costo_promedio (producto_id, costo_promedio_unidad_base, cantidad_total_unidades, valor_total_inventario) VALUES (?, ?, 0, 0)");
                $stmt->execute([$id, $value]);
            }
            $affected = 1;
        }
    } 
    elseif (in_array($field, ['PrecioVentaUnidad', 'PrecioVentaBlister', 'PrecioVentaMayor', 'PrecioVentaMixto'])) {
        $presId = 1; // Default
        if ($field === 'PrecioVentaUnidad') $presId = 1;
        elseif ($field === 'PrecioVentaBlister') $presId = 2;
        elseif ($field === 'PrecioVentaMayor') $presId = 3;
        
        $stmt = $pdo->prepare("INSERT INTO producto_presentaciones (producto_id, presentacion_id, precio_venta, activo) VALUES (?, ?, ?, 1) ON DUPLICATE KEY UPDATE precio_venta = VALUES(precio_venta)");
        $stmt->execute([$id, $presId, $value]);
        $affected = 1;
    }
    elseif (in_array($field, ['FactorBlister', 'FactorCaja'])) {
        $presId = ($field === 'FactorBlister') ? 2 : 3;
        $stmt = $pdo->prepare("INSERT INTO producto_presentaciones (producto_id, presentacion_id, factor_conversion, es_unidad_base, activo) VALUES (?, ?, ?, 0, 1) ON DUPLICATE KEY UPDATE factor_conversion = VALUES(factor_conversion), activo = 1");
        $stmt->execute([$id, $presId, $value]);
        $affected = 1;
    }
    elseif ($field === 'existencia') {
        $stmt = $pdo->prepare("INSERT INTO inventario_sucursal (producto_id, sucursal_id, stock_total) VALUES (?, 1, ?) ON DUPLICATE KEY UPDATE stock_total = VALUES(stock_total)");
        $stmt->execute([$id, $value]);
        $affected = 1;
    }
    elseif (in_array($field, ['FechaIngreso', 'FechaVencimiento', 'id_lugarCompra', 'presentaciones_venta'])) {
        // Ignored or handled via lugares_compra
        $affected = 1;
    }
    else {
        // Base product table fields
        $sql = "UPDATE productos SET $field = ? WHERE id = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$value, $id]);
        $affected = $stmt->rowCount();
    }

    json_success(['affected' => $affected], 'Campo actualizado');

} catch (Exception $e) {
    json_error('Error al actualizar: ' . $e->getMessage());
}
