<?php

namespace App\Services;

use App\Models\InventoryMovement;
use App\Models\InventoryMovementDetail;
use Carbon\Carbon;

class InventoryMovementService
{
    /**
     * Crea un movimiento de inventario con sus detalles.
     * IMPORTANTE: Este método NO maneja transacciones, debe ser llamado dentro de una transacción existente.
     *
     * @param string $tipo 'ENTRADA' | 'SALIDA'
     * @param array $details [{idProducto, cantidad, precioUnitario}]
     * @param string|null $observacion
     * @param int|null $userId
     * @return InventoryMovement
     */
    public static function createMovement(
        string $tipo,
        array $details,
        ?string $observacion = null,
        ?int $userId = null
    ): InventoryMovement {
        // Generar código de movimiento
        $last_mov = InventoryMovement::orderBy('id', 'desc')->first();
        $num = $last_mov ? ($last_mov->id + 1) : 1;
        $codigo = "MOV-" . str_pad($num, 6, "0", STR_PAD_LEFT);

        $movement = InventoryMovement::create([
            'codigo_movimiento' => $codigo,
            'tipo' => $tipo,
            'fecha' => Carbon::now(),
            'observacion' => $observacion,
            'user_id' => $userId,
            'state' => 1,
        ]);

        foreach ($details as $detail) {
            InventoryMovementDetail::create([
                'idMovimiento' => $movement->id,
                'idProducto' => $detail['idProducto'],
                'cantidad' => $detail['cantidad'],
                'precioUnitario' => $detail['precioUnitario'] ?? 0,
            ]);
        }

        return $movement;
    }
}
