<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Order extends BaseModel
{
    protected $table = 'orders';

    /**
     * Order status constants (matching database integer values)
     * 0: 新規 (New)
     * 1: 入金確認中 (Payment Confirming)
     * 2: 処理中 (Processing)
     * 3: 発送済み (Shipped)
     * 4: 返品済み (Returned)
     * 8: キャンセル (Cancelled)
     * 9: 仮予約 (Provisional)
     */
    const STATUS_NEW = 0;
    const STATUS_PAYMENT_CONFIRMING = 1;
    const STATUS_PROCESSING = 2;
    const STATUS_SHIPPED = 3;
    const STATUS_RETURNED = 4;
    const STATUS_CANCELLED = 8;
    const STATUS_PROVISIONAL = 9;

    protected $fillable = [
        'id', 'code', 'type', 'user_id', 'total_price', 'estimated_delivery_date',
        'payment_method', 'payment_status', 'payment_token', 'payment_token_expires_at', 'note', 'status',
        'is_activated', 'is_deleted', 'created_at', 'updated_at',
        // Provisional reservation fields
        'provisional_created_at', 'provisional_expires_at',
        'identity_verification_required', 'auto_cancelled', 'auto_cancelled_at', 'cancellation_reason',
        'payment_error', 'identity_verification_completed_at',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'provisional_created_at' => 'datetime',
        'provisional_expires_at' => 'datetime',
        'identity_verification_required' => 'boolean',
        'auto_cancelled' => 'boolean',
        'auto_cancelled_at' => 'datetime',
        'identity_verification_completed_at' => 'datetime',
    ];

    public function payment() {
        return $this->hasMany(Payment::class, 'order_id', 'id');
    }

    public function delivery() {
        return $this->hasMany(DeliveryAddress::class, 'order_id', 'id');
    }

    public function order_detail() {
        return $this->hasMany(OrderDetail::class, 'order_id', 'id')->with(['product_owner.owner', 'product:id,image']);
    }

    public function user() {
        return $this->belongsTo(User::class, 'user_id', 'id')->select('id', 'username', 'name', 'first_name', 'last_name', 'email', 'phone_number', 'post_code', 'city', 'address', 'address2', 'height', 'sleeve', 'waist');
    }

    /**
     * Check if order is a provisional reservation (status = 9)
     *
     * @return bool
     */
    public function isProvisional(): bool
    {
        return $this->status === self::STATUS_PROVISIONAL;
    }

    /**
     * Check if provisional reservation has expired
     *
     * @return bool
     */
    public function isProvisionalExpired(): bool
    {
        if (!$this->isProvisional() || !$this->provisional_expires_at) {
            return false;
        }

        return now()->greaterThan($this->provisional_expires_at);
    }

    /**
     * Check if order requires identity verification
     *
     * @return bool
     */
    public function requiresIdentityVerification(): bool
    {
        return $this->identity_verification_required === true;
    }

    /**
     * Get remaining time until provisional expires (in hours)
     *
     * @return float|null
     */
    public function getRemainingHours(): ?float
    {
        if (!$this->isProvisional() || !$this->provisional_expires_at) {
            return null;
        }

        $remaining = now()->diffInMinutes($this->provisional_expires_at, false);
        return $remaining > 0 ? round($remaining / 60, 1) : 0;
    }

    /**
     * Get remaining time until provisional expires (formatted string)
     *
     * @return string|null
     */
    public function getRemainingTimeFormatted(): ?string
    {
        $hours = $this->getRemainingHours();

        if ($hours === null) {
            return null;
        }

        if ($hours <= 0) {
            return '期限切れ';
        }

        if ($hours >= 24) {
            $days = floor($hours / 24);
            $remainingHours = $hours % 24;
            return sprintf('%d日%d時間', $days, $remainingHours);
        }

        return sprintf('%d時間', ceil($hours));
    }

    /**
     * Scope for provisional orders (status = 9)
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeProvisional($query)
    {
        return $query->where('status', self::STATUS_PROVISIONAL);
    }

    /**
     * Scope for expired provisional orders
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeExpiredProvisional($query)
    {
        return $query->where('status', self::STATUS_PROVISIONAL)
                     ->where('provisional_expires_at', '<', now())
                     ->where('auto_cancelled', false);
    }

    /**
     * Scope for orders requiring identity verification
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeRequiringIdentityVerification($query)
    {
        return $query->where('identity_verification_required', true);
    }
}
