<?php

namespace App\Traits\Purchase;

use App\Models\Bottle;
use App\Models\Perfume;
use App\Models\Product;

trait WithUpdateStock
{
    public function increaseOutletStock($outlet, $item)
    {
        $quantity = $item->quantity;

        switch ($item->purchasable_type) {
            case Perfume::class:
                $relation = 'perfumes';
                break;
            case Product::class:
                $relation = 'products';
                break;
            case Bottle::class:
                $relation = 'bottles';
                break;
            default:
                return;
        }

        $existing = $outlet->{$relation}()->withPivot('stock')->where("{$relation}.id", $item->purchasable_id)->first();

        if ($existing) {
            $previousStock = $existing->pivot->stock ?? 0;
            $outlet->{$relation}()->updateExistingPivot($item->purchasable_id, [
                'stock' => $previousStock + $quantity,
            ]);
        } else {
            $previousStock = 0;
            $outlet->{$relation}()->attach($item->purchasable_id, [
                'stock' => $quantity,
            ]);
        }

        activity('Belanja')
            ->performedOn($item->purchasable)
            ->causedBy(auth()->user())
            ->withProperties([
                'purchasable_id' => $item->purchasable_id,
                'purchasable_type' => $item->purchasable_type,
                'outlet_id' => $outlet->id,
                'quantity_change' => $quantity,
                'previous_stock' => $previousStock,
                'new_stock' => $previousStock + $quantity,
                'purchase_id' => $item->purchase_id ?? null,
            ])
            ->event('Menambah')
            ->log('Stok '.$item->purchasable->name.' di '.$outlet->name.' bertambah '.currency($quantity));
    }

    public function decreaseOutletStock($outlet, $item)
    {
        $quantity = $item->quantity;

        switch ($item->purchasable_type) {
            case Perfume::class:
                $relation = 'perfumes';
                break;
            case Product::class:
                $relation = 'products';
                break;
            case Bottle::class:
                $relation = 'bottles';
                break;
            default:
                return;
        }

        $existing = $outlet->{$relation}()->withPivot('stock')->where("{$relation}.id", $item->purchasable_id)->first();

        if ($existing) {
            $currentStock = $existing->pivot->stock ?? 0;
            $newStock = max(0, $currentStock - $quantity);
            $outlet->{$relation}()->updateExistingPivot($item->purchasable_id, [
                'stock' => $newStock,
            ]);
        }

        activity('Belanja')
            ->performedOn($item->purchasable)
            ->causedBy(auth()->user())
            ->withProperties([
                'purchasable_id' => $item->purchasable_id,
                'purchasable_type' => $item->purchasable_type,
                'outlet_id' => $outlet->id,
                'quantity_change' => $quantity,
                'previous_stock' => $currentStock,
                'new_stock' => $newStock,
                'purchase_id' => $item->purchase_id,
            ])
            ->event('Mengurangi')
            ->log('Stok '.$item->purchasable->name.' di '.$outlet->name.' berkurang '.$quantity);
    }
}
