<?php

namespace App\Models;

use App\Enums\PredictionSource;
use App\Enums\TrendDirection;
use Database\Factories\PricePredictionFactory;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;

#[Fillable(['predicted_for', 'source', 'direction', 'confidence', 'reasoning', 'generated_at'])]
class PricePrediction extends Model
{
    /** @use HasFactory<PricePredictionFactory> */
    use HasFactory;

    public $timestamps = false;

    protected function casts(): array
    {
        return [
            'predicted_for' => 'date',
            'source' => PredictionSource::class,
            'direction' => TrendDirection::class,
            'confidence' => 'integer',
            'generated_at' => 'datetime',
        ];
    }

    /**
     * Order by source quality: llm_with_context → llm → ewma.
     * Use this whenever reading the "best" prediction for a given date.
     *
     * @param  Builder<PricePrediction>  $query
     * @return Builder<PricePrediction>
     */
    public function scopeBestFirst(Builder $query): Builder
    {
        $priority = implode(', ', array_map(
            fn (string $v) => "'$v'",
            [PredictionSource::LlmWithContext->value, PredictionSource::Llm->value, PredictionSource::Ewma->value],
        ));

        return $query->orderByRaw("FIELD(source, $priority)");
    }
}
