<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Relations\HasMany;

class CustomOrder extends Model
{
    protected $fillable = [
        'user_id',
        'uuid',
        'order_number',
        'type',
        'status',
        'design_fee',
        'library_discount_applied',
        'material_cost',
        'total_cost',
        'deposit_amount',
        'balance_amount',
        'deposit_status',
        'balance_status',
        'yoco_checkout_id',
        'yoco_redirect_url',
        'yoco_checkout_response',
        'customer_brief',
        'admin_notes',
        'submitted_at',
        'approved_at',
        'rejected_at',
        'completed_at',
        'proof_approved',
        'proof_approved_at',
        'packing_width',
        'packing_length',
        'packing_weight',
        'packing_completed_at',
        'packed_by',
        'courier_waybill_id',
        'courier_tracking_number',
        'courier_status',
        'delivered_at',
        'delivery_failure_reason',
        'trello_card_id',
        'qr_token',
        'qr_generated_at',
    ];

    protected $casts = [
        'library_discount_applied' => 'boolean',
        'proof_approved' => 'boolean',
        'design_fee' => 'decimal:2',
        'material_cost' => 'decimal:2',
        'total_cost' => 'decimal:2',
        'deposit_amount' => 'decimal:2',
        'balance_amount' => 'decimal:2',
        'submitted_at' => 'datetime',
        'approved_at' => 'datetime',
        'rejected_at' => 'datetime',
        'completed_at' => 'datetime',
        'proof_approved_at' => 'datetime',
        'packing_completed_at' => 'datetime',
        'delivered_at' => 'datetime',
    ];

    /**
     * Boot method for model
     */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->uuid = \Illuminate\Support\Str::uuid();
            $model->order_number = 'CUSTOM-' . now()->format('Ymd') . '-' . strtoupper(uniqid());
            $model->submitted_at = now();
        });
    }

    /**
     * Get the user that owns this custom order
     */
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    /**
     * Get the specifications for this custom order
     */
    public function specifications(): HasOne
    {
        return $this->hasOne(CustomOrderSpecification::class);
    }

    /**
     * Get the files uploaded for this custom order
     */
    public function files(): HasMany
    {
        return $this->hasMany(CustomOrderFile::class);
    }

    /**
     * Get the proofs uploaded for this custom order
     */
    public function proofs(): HasMany
    {
        return $this->hasMany(CustomOrderProof::class);
    }

    /**
     * Get route key name for implicit route binding
     */
    public function getRouteKeyName()
    {
        return 'uuid';
    }

    public function packedBy()
    {
        return $this->belongsTo(User::class, 'packed_by');
    }

    /**
     * Check if this is a custom order
     */
    public function isCustomOrder(): bool
    {
        return true;
    }
}
