<?php

namespace App\Models;

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

class Item extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'category_id',
        'manufacturer_id',
        'title',
        'description',
        'model',
        'serial_number',
        'year',
        'condition',
        'price',
        'quantity',
        'status',
        'listing_type',
        'open_to_trades',
        'offers_enabled',
        'location_city',
        'location_state',
        'location_country',
        'shipping_available',
        'shipping_cost',
        'shipping_buyer_pays',
        'local_pickup',
        'featured_until',
        'admin_note',
    ];

    protected function casts(): array
    {
        return [
            'price' => 'decimal:2',
            'shipping_cost' => 'decimal:2',
            'shipping_available' => 'boolean',
            'shipping_buyer_pays' => 'boolean',
            'local_pickup' => 'boolean',
            'open_to_trades' => 'boolean',
            'offers_enabled' => 'boolean',
            'featured_until' => 'datetime',
        ];
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function manufacturer()
    {
        return $this->belongsTo(Manufacturer::class);
    }

    public function photos()
    {
        return $this->hasMany(ItemPhoto::class)->orderBy('sort_order');
    }

    public function primaryPhoto()
    {
        return $this->hasOne(ItemPhoto::class)->where('is_primary', true);
    }

    public function buyQueue()
    {
        return $this->hasMany(BuyQueue::class)->orderBy('position');
    }

    public function conversations()
    {
        return $this->hasMany(Conversation::class);
    }

    public function transactions()
    {
        return $this->hasMany(Transaction::class);
    }

    public function offers()
    {
        return $this->hasMany(Offer::class)->orderBy('created_at', 'desc');
    }

    public function scopeActive($query)
    {
        return $query->where('status', 'active');
    }

    public function scopeForSale($query)
    {
        return $query->where('listing_type', 'sale');
    }

    public function scopePubliclyVisible($query)
    {
        return $query->whereIn('listing_type', ['sale', 'inventory_open']);
    }

    public function scopeInventory($query)
    {
        return $query->where('listing_type', 'inventory');
    }

    public function scopeInventoryOpen($query)
    {
        return $query->where('listing_type', 'inventory_open');
    }

    public function watchlists()
    {
        return $this->hasMany(Watchlist::class);
    }

    public function watchers()
    {
        return $this->belongsToMany(User::class, 'watchlists')->withTimestamps();
    }

    public function watchersCount()
    {
        return $this->watchlists()->count();
    }
}
