<?php

namespace App\Models;

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

class Booking extends Model
{
    protected $table = 'bookings';

    protected $fillable = [
        'accepted_at',
        'payment_due_at',
        'uuid',
        'client_id',
        'professional_id',
        'profession_id',
        'type',
        'date',
        'time',
        'status',
        'decline_reason',
        'payment_status',
        'professional_payout_id',
        'released_at',
        'amount',
        'convenience_fee_amount',
        'platform_fee_percentage',
        'platform_fee_amount',
        'professional_net_amount',
        'concern',
        'room_id',
        'reminder_sent_at',
        'consultation_started_at',
        'consultation_closed_at',
        'consultation_accumulated_seconds',
        'consultation_active_started_at',
        'consultation_client_last_seen_at',
        'consultation_professional_last_seen_at',
        'consultation_warning_sent_at',
    ];

    protected function casts(): array
    {
        return [
            'accepted_at' => 'datetime',
            'payment_due_at' => 'datetime',
            'reminder_sent_at' => 'datetime',
            'consultation_started_at' => 'datetime',
            'consultation_closed_at' => 'datetime',
            'consultation_active_started_at' => 'datetime',
            'consultation_client_last_seen_at' => 'datetime',
            'consultation_professional_last_seen_at' => 'datetime',
            'consultation_warning_sent_at' => 'datetime',
            'released_at' => 'datetime',
            'amount' => 'decimal:2',
            'convenience_fee_amount' => 'decimal:2',
            'platform_fee_percentage' => 'decimal:2',
            'platform_fee_amount' => 'decimal:2',
            'professional_net_amount' => 'decimal:2',
        ];
    }

    public function unpaidDeadlinePassed(): bool
    {
        if ($this->type !== 'appointment' || $this->payment_status === 'paid'
            || ! in_array($this->status, ['pending', 'accepted'], true)
            || $this->consultation_started_at || $this->consultation_closed_at) {
            return false;
        }
        if ($this->payment_due_at) {
            return $this->payment_due_at->lte(now());
        }
        return \Carbon\Carbon::parse("{$this->date} {$this->time}", config('desxpert.booking_timezone'))->lte(now());
    }

    public function professional(): BelongsTo
    {
        return $this->belongsTo(Professional::class, 'professional_id');
    }

    public function client(): BelongsTo
    {
        return $this->belongsTo(User::class, 'client_id');
    }

    public function payout(): BelongsTo
    {
        return $this->belongsTo(ProfessionalPayout::class, 'professional_payout_id');
    }


    public function ratings(): HasMany
    {
        return $this->hasMany(Rating::class, 'booking_id');
    }

    public function attachments(): HasMany
    {
        return $this->hasMany(BookingAttachment::class, 'booking_id');
    }
}
