<?php

namespace App\Services;

use App\Models\BrentPrice;
use App\Services\BrentPriceSources\BrentPriceFetchException;
use App\Services\BrentPriceSources\EiaBrentPriceSource;
use App\Services\BrentPriceSources\FredBrentPriceSource;

final readonly class BrentPriceFetcher
{
    public function __construct(
        private readonly EiaBrentPriceSource $eia,
        private readonly FredBrentPriceSource $fred,
    ) {}

    /**
     * Fetch from EIA and persist. Throws on failure.
     */
    public function fetchFromEia(): void
    {
        $rows = $this->eia->fetch();

        if ($rows === null) {
            throw new BrentPriceFetchException('EIA fetch returned no data');
        }

        BrentPrice::upsert($rows, ['date'], ['price_usd']);
    }

    /**
     * Fetch from FRED and persist. Throws on failure.
     */
    public function fetchFromFred(): void
    {
        $rows = $this->fred->fetch();

        if ($rows === null) {
            throw new BrentPriceFetchException('FRED fetch returned no data');
        }

        BrentPrice::upsert($rows, ['date'], ['price_usd']);
    }
}
