<?php

namespace App\Console\Commands;

use App\Services\BrentPricePredictor;
use Illuminate\Console\Command;
use Throwable;

class PredictOilPrices extends Command
{
    protected $signature = 'oil:predict {--force : Generate even if the latest price already has a prediction}';

    protected $description = 'Generate a Brent crude oil price direction prediction';

    public function handle(BrentPricePredictor $predictor): int
    {
        try {
            $latest = $predictor->latestPrice();

            if ($latest?->prediction_generated_at !== null && ! $this->option('force')) {
                $message = sprintf(
                    'Prediction already generated for %s at %s.',
                    $latest->date->toDateString(),
                    $latest->prediction_generated_at->toDateTimeString(),
                );

                if (! $this->confirm($message.' Run again anyway?', default: false)) {
                    $this->info('Skipped.');

                    return self::SUCCESS;
                }
            }

            $this->info('Generating prediction...');
            $prediction = $predictor->generatePrediction();

            if ($prediction === null) {
                $this->error('Could not generate a prediction — not enough price data.');

                return self::FAILURE;
            }

            $this->info(sprintf(
                'Done. [%s] direction=%s confidence=%d%% — %s',
                strtoupper($prediction->source->value),
                $prediction->direction->value,
                $prediction->confidence,
                $prediction->reasoning,
            ));
        } catch (Throwable $e) {
            $this->error("Prediction failed: {$e->getMessage()}");

            return self::FAILURE;
        }

        return self::SUCCESS;
    }
}
