<?php

namespace App\Models\Tenant;

use App\Models\Concerns\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class WorkOrderPart extends Model
{
    use BelongsToTenant;

    protected $table = 'wo_parts';

    public const STATUSES = [
        'needed' => 'Necesară',
        'ordered' => 'Comandată',
        'delivered' => 'Sosită',
        'installed' => 'Montată',
    ];

    protected $fillable = [
        'company_id', 'work_order_id', 'part_id',
        'name', 'article', 'brand',
        'qty', 'unit', 'buy_price', 'sell_price',
        'discount_pct', 'total', 'status', 'notes',
    ];

    protected $casts = [
        'qty' => 'decimal:2',
        'buy_price' => 'decimal:2',
        'sell_price' => 'decimal:2',
        'discount_pct' => 'decimal:2',
        'total' => 'decimal:2',
    ];

    public function workOrder(): BelongsTo
    {
        return $this->belongsTo(WorkOrder::class);
    }

    public function part(): BelongsTo
    {
        return $this->belongsTo(Part::class);
    }

    protected static function booted(): void
    {
        static::saving(function (self $row) {
            $sub = (float) $row->qty * (float) $row->sell_price;
            $disc = (float) $row->discount_pct;
            $row->total = round($sub * (1 - $disc / 100), 2);
        });

        // When a part is marked installed, decrement catalog stock once.
        static::updating(function (self $row) {
            $wasInstalled = $row->getOriginal('status') === 'installed';
            $isInstalled = $row->status === 'installed';
            if (! $wasInstalled && $isInstalled && $row->part_id) {
                $part = Part::find($row->part_id);
                $part?->adjustStock(-(float) $row->qty);
            }
            // If reverting from installed → restore stock
            if ($wasInstalled && ! $isInstalled && $row->part_id) {
                $part = Part::find($row->part_id);
                $part?->adjustStock((float) $row->qty);
            }
        });

        static::saved(fn (self $row) => $row->workOrder?->recalcTotal());
        static::deleted(fn (self $row) => $row->workOrder?->recalcTotal());
    }
}
