<?php

namespace App\Console\Commands;

use App\Events\PricesUpdatedEvent;
use App\Models\Station;
use App\Services\FuelPriceService;
use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
use Throwable;

class PollFuelPrices extends Command
{
    protected $signature = 'fuel:poll {--full : Force refresh station metadata before polling}';

    protected $description = 'Poll the Fuel Finder API for latest prices';

    public function handle(FuelPriceService $service): int
    {
        $fullRefresh = (bool) $this->option('full');
        $lastRefresh = Station::max('last_seen_at');
        $stationsStale = $lastRefresh === null || Carbon::parse($lastRefresh)->isBefore(today());

        try {
            if ($fullRefresh || $stationsStale) {
                $this->info('Refreshing station metadata...');
                $service->refreshStations();
            }

            $this->info('Polling fuel prices...');
            $inserted = $service->pollPrices();

            $this->info("Done. $inserted new price record(s) inserted.");

            PricesUpdatedEvent::dispatch($inserted, $fullRefresh);
        } catch (Throwable $e) {
            $this->error("Poll failed: {$e->getMessage()}");
            $this->error("In {$e->getFile()}:{$e->getLine()}");
            $this->line($e->getTraceAsString());

            return self::FAILURE;
        }

        return self::SUCCESS;
    }
}
