<?php

namespace App\Models\Accounts\LinhasDoTempo;

use App\Enums\Accounts\LinhasDoTempoTimelineStatus;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Str;
use DateTimeInterface;

/**
 * Linha do tempo (processo/serviço) pertencente a um usuário da Conta-Angra.
 */
class Timeline extends Model {

    use HasFactory;
    use SoftDeletes;

    protected $connection = 'mysql';

    public $incrementing = false;

    protected $keyType = 'string';

    protected $table = 'lt_timelines';

    protected $fillable = [
        'id',
        'user_id',
        'name',
        'description',
        'process_text',
        'event_date',
        'tags',
        'status',
    ];

    protected $casts = [
        'event_date' => 'date',
        'tags' => 'array',
    ];

    public static function boot(): void {
        parent::boot();
        static::creating(function (self $model): void {
            if (empty($model->id)) {
                $model->id = (string) Str::uuid();
            }
            if (empty($model->status)) {
                $model->status = LinhasDoTempoTimelineStatus::Active->value;
            }
        });
    }

    protected function serializeDate(DateTimeInterface $date): string {
        return $date->format('Y-m-d H:i:s');
    }

    /**
     * Usuário criador da linha do tempo.
     */
    public function user(): BelongsTo {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

    /**
     * Pontos históricos ordenados por data de acontecimento.
     */
    public function historicalPoints(): HasMany {
        return $this->hasMany(HistoricalPoint::class, 'timeline_id', 'id')
            ->orderBy('event_date')
            ->orderBy('created_at');
    }

    /**
     * Pontos ativos (não excluídos logicamente).
     */
    public function activeHistoricalPoints(): HasMany {
        return $this->historicalPoints()->whereNull('deleted_at');
    }

}
