<?php

namespace Koneko\VuexyWarehouse\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Koneko\VuexyStoreManager\Models\Currency;
use Koneko\SatCatalogs\Models\ClaveUnidad;
use Koneko\SatCatalogs\Models\ClaveProdServ;
use Koneko\VuexyAdmin\Models\User;

class Product extends Model
{
    use HasFactory;

    protected $table = 'products';
    protected $primaryKey = 'id';
    public $incrementing = false;
    protected $keyType = 'mediumint';

    protected $fillable = [
        'type',
        'category_id',
        'descripcion',
        'descripcion_completa',
        'no_identificacion',
        'slug',
        'available_in_pos',
        'available_in_purchases',
        'available_in_ecommerce',
        'available_in_purchases',
        'available_in_maanufacturing',
        'available_in_quality',
        'available_in_assets',
        'c_clave_unidad',
        'c_clave_prod_serv',
        'ean_code',
        'costo',
        'c_moneda',
        'c_objeto_imp',
        'impuestos',
        'traslados',
        'retenciones',
        'data_lot_enable',
        'data_lot_require',
        'data_series_enable',
        'data_series_require',
        'data_expiration_enable',
        'data_expiration_require',
        'data_warranty_enable',
        'warranty',
        'data_best_before_enable',
        'data_best_before_require',
        'data_observations_enable',
        'minimum_unit',
        'affects_inventory',
        'alert_minimum_stock',
        'alert_maximum_stock',
        'minimum_stock',
        'maximum_stock',
        'status',
        'created_by'
    ];

    protected $casts = [
        'available_in_pos',
        'available_in_purchases' => 'boolean',
        'available_in_ecommerce' => 'boolean',
        'available_in_purchases' => 'boolean',
        'available_in_maanufacturing' => 'boolean',
        'available_in_quality' => 'boolean',
        'available_in_assets' => 'boolean',
        'costo' => 'decimal:2',
        'traslados' => 'decimal:6',
        'retenciones' => 'decimal:6',
        'minimum_unit' => 'decimal:6',
        'minimum_stock' => 'decimal:6',
        'maximum_stock' => 'decimal:6',
        'data_lot_enable' => 'boolean',
        'data_lot_require' => 'boolean',
        'data_series_enable' => 'boolean',
        'data_series_require' => 'boolean',
        'data_expiration_enable' => 'boolean',
        'data_expiration_require' => 'boolean',
        'data_warranty_enable' => 'boolean',
        'data_best_before_enable' => 'boolean',
        'data_best_before_require' => 'boolean',
        'data_observations_enable' => 'boolean',
        'affects_inventory' => 'boolean',
        'alert_minimum_stock' => 'boolean',
        'alert_maximum_stock' => 'boolean',
    ];

    /**
     * Relación con la categoría del producto.
     */
    public function category(): BelongsTo
    {
        return $this->belongsTo(ProductCategory::class, 'category_id');
    }

    /**
     * Relación con la moneda.
     */
    public function currency(): BelongsTo
    {
        return $this->belongsTo(Currency::class, 'c_moneda', 'c_currency');
    }

    /**
     * Relación con la clave unidad SAT.
     */
    public function claveUnidad(): BelongsTo
    {
        return $this->belongsTo(ClaveUnidad::class, 'c_clave_unidad', 'c_clave_unidad');
    }

    /**
     * Relación con la clave de producto/servicio SAT.
     */
    public function claveProdServ(): BelongsTo
    {
        return $this->belongsTo(ClaveProdServ::class, 'c_clave_prod_serv', 'c_clave_prod_serv');
    }

    /**
     * Relación con el usuario que creó el producto.
     */
    public function createdBy(): BelongsTo
    {
        return $this->belongsTo(User::class, 'created_by');
    }
}