<?php

declare(strict_types=1);

namespace App\Models;

use Database\Factories\ReminderFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
 * Напоминание на сделке (schema v8.10 §17.5).
 *
 * Tenant-aware модель с RLS. Композитные индексы:
 * - idx_reminders_due (remind_at) WHERE is_sent=FALSE AND completed_at IS NULL — cron;
 * - idx_reminders_deal (deal_id) — UI карточки сделки;
 * - idx_reminders_tenant_user_active — дашборд «today/last/future».
 *
 * deal_id БЕЗ FK (deals партиционирована, FK на partitioned-родительскую
 * таблицу не поддерживается без partition-key в составе).
 *
 * MVP: assignee_id всегда NULL — паритет с histories[].to оригинала. Поле
 * зарезервировано для Post-MVP (multi-assignee).
 *
 * @mixin IdeHelperReminder
 */
class Reminder extends Model
{
    /** @use HasFactory<ReminderFactory> */
    use HasFactory;

    protected $fillable = [
        'tenant_id',
        'deal_id',
        'text',
        'remind_at',
        'created_by',
        'assignee_id',
        'completed_at',
        'is_sent',
        'sent_at',
    ];

    protected function casts(): array
    {
        return [
            'tenant_id' => 'integer',
            'deal_id' => 'integer',
            'created_by' => 'integer',
            'assignee_id' => 'integer',
            'is_sent' => 'boolean',
            'remind_at' => 'datetime',
            'completed_at' => 'datetime',
            'sent_at' => 'datetime',
            'created_at' => 'datetime',
            'updated_at' => 'datetime',
        ];
    }

    /** @return BelongsTo<Tenant, $this> */
    public function tenant(): BelongsTo
    {
        return $this->belongsTo(Tenant::class);
    }

    /** @return BelongsTo<User, $this> */
    public function creator(): BelongsTo
    {
        return $this->belongsTo(User::class, 'created_by');
    }

    /** @return BelongsTo<User, $this> */
    public function assignee(): BelongsTo
    {
        return $this->belongsTo(User::class, 'assignee_id');
    }

    public function isCompleted(): bool
    {
        return $this->completed_at !== null;
    }

    public function isOverdue(): bool
    {
        return $this->completed_at === null && $this->remind_at < now();
    }
}
