<?php

namespace App\Models;

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

class Produk extends Model
{
    use HasFactory;

    protected $table = 'produks';

    protected $fillable = [
        'kategori_id',
        'nama_produk',
        'deskripsi',
        'harga',
        'stok',
        'berat',
        'ukuran',
        'warna',
        'rating',
        'terjual',
        'foto',
        'status',
        'user_id',
    ];

    /**
     * Relasi ke Kategori
     */
    public function kategori()
    {
        return $this->belongsTo(Kategori::class, 'kategori_id', 'ID');
    }

    /**
     * Relasi ke User (Penjual)
     */
    public function user()
    {
        return $this->belongsTo(User::class, 'user_id');
    }

    /**
     * Relasi ke Toko
     */
    public function toko()
    {
        return $this->belongsTo(Toko::class, 'toko_id');
    }

    /**
     * Relasi ke Detail Pesanan
     * INI YANG PALING PENTING - untuk memperbaiki error
     */
    public function detailPesanan()
    {
        return $this->hasMany(PesananDetail::class, 'produk_id');
    }

    /**
     * Relasi ke Pesanan melalui detailPesanan (many-to-many)
     */
    public function pesanan()
    {
        return $this->belongsToMany(Pesanan::class, 'pesanan_detail', 'produk_id', 'pesanan_id')
                    ->withPivot('jumlah', 'harga', 'subtotal', 'warna', 'ukuran')
                    ->withTimestamps();
    }

    /**
     * Relasi ke Keranjang
     */
    public function keranjang()
    {
        return $this->hasMany(Keranjang::class, 'produk_id');
    }

    /**
     * Scope untuk produk dengan stok menipis (stok < 5 dan > 0)
     */
    public function scopeStokMenipis($query)
    {
        return $query->where('stok', '<', 5)->where('stok', '>', 0);
    }

    /**
     * Scope untuk produk habis (stok = 0)
     */
    public function scopeHabis($query)
    {
        return $query->where('stok', 0);
    }

    /**
     * Scope untuk produk tersedia (stok > 0)
     */
    public function scopeTersedia($query)
    {
        return $query->where('stok', '>', 0);
    }

    /**
     * Scope untuk produk milik user tertentu
     */
    public function scopeMilikUser($query, $userId)
    {
        return $query->where('user_id', $userId);
    }

    /**
     * Accessor untuk format harga (Rp)
     */
    public function getHargaFormatAttribute()
    {
        return 'Rp ' . number_format($this->harga, 0, ',', '.');
    }

    /**
     * Accessor untuk status stok dengan badge HTML
     */
    public function getStatusStokAttribute()
    {
        if ($this->stok <= 0) {
            return '<span class="px-2 py-1 bg-red-100 text-red-600 rounded-full text-xs font-medium">Habis</span>';
        } elseif ($this->stok < 5) {
            return '<span class="px-2 py-1 bg-yellow-100 text-yellow-600 rounded-full text-xs font-medium">Menipis</span>';
        } else {
            return '<span class="px-2 py-1 bg-green-100 text-green-600 rounded-full text-xs font-medium">Tersedia</span>';
        }
    }

    /**
     * Accessor untuk status stok plain text
     */
    public function getStatusStokTextAttribute()
    {
        if ($this->stok <= 0) {
            return 'Habis';
        } elseif ($this->stok < 5) {
            return 'Menipis';
        } else {
            return 'Tersedia';
        }
    }

    /**
     * Accessor untuk warna status stok
     */
    public function getStatusStokWarnaAttribute()
    {
        if ($this->stok <= 0) {
            return 'red';
        } elseif ($this->stok < 5) {
            return 'yellow';
        } else {
            return 'green';
        }
    }

    /**
     * Mendapatkan total penjualan produk ini
     */
    public function getTotalTerjualAttribute()
    {
        return $this->detailPesanan()
                    ->whereHas('pesanan', function($q) {
                        $q->where('status', 'selesai');
                    })
                    ->sum('qty');
    }

    /**
     * Mendapatkan total pendapatan dari produk ini
     */
    public function getTotalPendapatanAttribute()
    {
        return $this->detailPesanan()
                    ->whereHas('pesanan', function($q) {
                        $q->where('status', 'selesai');
                    })
                    ->sum('subtotal');
    }

    /**
     * Mengecek apakah produk bisa dihapus
     */
    public function canDelete()
    {
        // Cek apakah produk pernah dipesan
        $pernahDipesan = $this->detailPesanan()->exists();
        
        // Cek apakah produk ada di keranjang
        $adaDiKeranjang = $this->keranjang()->exists();
        
        return !$pernahDipesan && !$adaDiKeranjang;
    }

    /**
     * Boot method untuk menambahkan event
     */
    protected static function boot()
    {
        parent::boot();

        // Event sebelum produk dihapus
        static::deleting(function ($produk) {
            // Hapus relasi keranjang terlebih dahulu
            $produk->keranjang()->delete();
            
            // Cek apakah produk pernah dipesan
            if ($produk->detailPesanan()->exists()) {
                throw new \Exception('Tidak dapat menghapus produk karena sudah pernah dipesan');
            }
        });
    }
}