import { Category } from "./enums/Category";
import { GeoLimit } from "./enums/GeoLimit";
import { GeoTrunc } from "./enums/GeoTrunc";
import { Lang } from "./enums/Lang";
import { TimeTrunc } from "./enums/TimeTrunc";
import { Widget } from "./enums/Widget";

export type ClientConfig = {
    baseUrl?: string;
}

export type GetByCategoryByWidgetParams = {
    lang?: Lang;
    category: Category;
    widget: Widget;
    query: {
        startDate: string; // ISO 8601 format
        endDate: string; // ISO 8601 format
        timeTrunc: TimeTrunc;
        geotrunc?: GeoTrunc;
        geoLimit?: GeoLimit;
        geoIds?: string;
    }
}

export class Client {
    private lang: Lang = Lang.es; 
    constructor(private readonly config: ClientConfig = { baseUrl: 'https://apidatos.ree.es' }) { }

    private buildUrl({ category, widget, lang }: { category: Category, widget: Widget, lang: Lang}) {
        return new URL(`${this.config.baseUrl}/${lang}/datos/${category}/${widget}`);        
    }

    async getByCategoryByWidget(params: GetByCategoryByWidgetParams) {
        const { lang = this.lang, category, widget, query } = params;

        const url = this.buildUrl({ category, widget, lang });
        
        url.searchParams.set('start_date', query.startDate);
        url.searchParams.set('end_date', query.endDate);
        url.searchParams.set('time_trunc', query.timeTrunc);

        if (query.geotrunc) {
            url.searchParams.set('geo_trunc', query.geotrunc);
        }
        if (query.geoLimit) {
            url.searchParams.set('geo_limit', query.geoLimit);
        }
        if (query.geoIds) {
            url.searchParams.set('geo_ids', query.geoIds);
        }

        const response = await fetch(url.toString());
        
        if (!response.ok) {
            throw new Error(`Error fetching data: ${response.statusText}`);
        }

        return response.json();
    }
}