<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class SerahTerimaBarang extends Model
{
    use HasFactory;

    protected $table = 'serah_terima_barangs';

    protected $fillable = [
        'serah_terima_id',
        'inventaris_id',
        'kode_barang',
        'nama_barang',
        'merk',
        'tahun',
        'asal_usul',
        'satuan',
        'kepemilikan',
        'jumlah',
        'keterangan',
    ];

    public function serahTerima()
    {
        return $this->belongsTo(SerahTerima::class);
    }

    public function inventaris()
    {
        return $this->belongsTo(Inventaris::class);
    }

    protected static function booted()
    {
        static::creating(function ($model) {
            if ($model->inventaris_id) {
                $inventaris = Inventaris::find($model->inventaris_id);
                if ($inventaris) {
                    $model->fill([
                        'kode_barang' => $inventaris->kode_barang,
                        'nama_barang' => $inventaris->nama_barang,
                        'merk' => $inventaris->merk,
                        'tahun' => $inventaris->tahun_beli_perolehan,
                        'asal_usul' => $inventaris->asal_usul,
                        'satuan' => $inventaris->satuan,
                        'kepemilikan' => $inventaris->kepemilikan,
                    ]);
                }
            }
        });

        static::created(function ($model) {
            $model->loadMissing('serahTerima', 'inventaris');

            if ($model->serahTerima && $model->serahTerima->status === 'menyerahkan' && $model->inventaris) {
                $totalDiserahkan = $model->serahTerima->barang()
                    ->where('inventaris_id', $model->inventaris_id)
                    ->sum('jumlah');
                    
                if ($totalDiserahkan > $model->inventaris->jumlah_baik) {
                    $model->delete();
                    throw new \Exception("Total penyerahan melebihi stok yang tersedia (Stok: {$model->inventaris->jumlah_baik})");
                }
                
                $model->inventaris->jumlah_baik = $model->inventaris->jumlah_baik - $totalDiserahkan;
                $model->inventaris->save();
            } elseif ($model->serahTerima && $model->serahTerima->status === 'menerima') {
                $inventaris = Inventaris::updateOrCreate(
                    ['kode_barang' => $model->kode_barang],
                    [
                        'nama_barang' => $model->nama_barang,
                        'merk' => $model->merk,
                        'tahun_beli_perolehan' => $model->tahun,
                        'satuan' => $model->satuan,
                        'asal_usul' => $model->asal_usul,
                        'kepemilikan' => $model->kepemilikan,
                        'jumlah_baik' => $model->inventaris ? $model->inventaris->jumlah_baik : 0,
                    ]
                );
                
                $inventaris->increment('jumlah_baik', $model->jumlah);
                $model->update(['inventaris_id' => $inventaris->id]);
            }
        });

        static::updating(function ($model) {
            $originalJumlah = $model->getOriginal('jumlah');
            $newJumlah = $model->jumlah;
            $difference = $newJumlah - $originalJumlah;

            if ($model->serahTerima && $model->serahTerima->status === 'menyerahkan' && $model->inventaris) {
                $totalDiserahkan = $model->serahTerima->barang()
                    ->where('inventaris_id', $model->inventaris_id)
                    ->where('id', '!=', $model->id)
                    ->sum('jumlah');
                    
                $availableStock = $model->inventaris->jumlah_baik - $totalDiserahkan;
                
                if ($newJumlah > $availableStock) {
                    throw new \Exception("Jumlah melebihi stok yang tersedia (Stok tersedia: {$availableStock})");
                }
                
                $model->inventaris->jumlah_baik = $availableStock - $newJumlah;
                $model->inventaris->save();
            } elseif ($model->serahTerima && $model->serahTerima->status === 'menerima' && $model->inventaris) {
                $model->inventaris->increment('jumlah_baik', $difference);
            }
        });

        static::deleted(function ($model) {
            if ($model->serahTerima && $model->inventaris) {
                if ($model->serahTerima->status === 'menyerahkan') {
                    $model->inventaris->increment('jumlah_baik', $model->jumlah);
                } elseif ($model->serahTerima->status === 'menerima') {
                    $model->inventaris->decrement('jumlah_baik', $model->jumlah);
                    
                    if ($model->inventaris->jumlah_baik <= 0) {
                        $model->inventaris->delete();
                    }
                }
            }
        });
    }
}
