<?php

namespace App\Services\Concerns;

use App\Enums\ProductStockQuality;
use App\Models\ProductVariant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;

trait HasStockAdjustment
{
    private const QUALITY_STOCK_MAP = [
        ProductStockQuality::GOOD->value => 'stock',
        ProductStockQuality::REJECT->value => 'reject_stock',
    ];

    private function adjustStock(Model $model, string $field, int $quantity, int $sign): void
    {
        if ($sign > 0) {
            $model->increment($field, $quantity);
        } else {
            if ($model->{$field} < $quantity) {
                $label = match ($field) {
                    'stock' => 'stok bagus',
                    'reject_stock' => 'stok reject',
                    'retail_stock' => 'stok ecer',
                    default => $field,
                };
                throw ValidationException::withMessages([
                    'stock' => "Stok {$label} tidak mencukupi. Tersedia: {$model->{$field}}, dibutuhkan: {$quantity}.",
                ]);
            }
            $model->decrement($field, $quantity);
        }
    }

    private function adjustVariantStock(int $variantId, int $quantity, int $sign, string $stockType): void
    {
        $field = self::QUALITY_STOCK_MAP[$stockType] ?? 'stock';

        $this->adjustStock(
            model: app(ProductVariant::class)->newQuery()->findOrFail($variantId),
            field: $field,
            quantity: $quantity,
            sign: $sign,
        );
    }

    private function applyStock(array $items, string $stockType, int $sign): void
    {
        DB::transaction(function () use ($items, $stockType, $sign) {
            foreach ($items as $item) {
                $this->adjustVariantStock($item['product_variant_id'], $item['quantity'], $sign, $stockType);
            }
        });
    }
}
