import type { Filters, FiltersMeta, LinksResponse } from './types';

function csrf(): string {
    return (document.querySelector('meta[name="csrf-token"]') as HTMLMetaElement)?.content ?? '';
}

export async function fetchLinks(filters: Filters, page: number, apiUrl: string): Promise<LinksResponse> {
    const params = new URLSearchParams();
    params.set('page', String(page));
    if (filters.search)          params.set('search', filters.search);
    if (filters.project_id)      params.set('project_id', String(filters.project_id));
    if (filters.category_id)     params.set('category_id', String(filters.category_id));
    if (filters.tag_id)          params.set('tag_id', String(filters.tag_id));
    if (filters.reading_status)  params.set('reading_status', filters.reading_status);
    if (filters.is_favorite)     params.set('is_favorite', '1');
    params.set('sort', filters.sort);

    const res = await fetch(`${apiUrl}?${params.toString()}`, {
        headers: { Accept: 'application/json' },
        credentials: 'same-origin',
    });
    if (!res.ok) throw new Error(`API error ${res.status}`);
    return res.json() as Promise<LinksResponse>;
}

export async function fetchFiltersMeta(metaUrl: string): Promise<FiltersMeta> {
    const res = await fetch(metaUrl, { headers: { Accept: 'application/json' }, credentials: 'same-origin' });
    if (!res.ok) throw new Error('Filters meta failed');
    return res.json() as Promise<FiltersMeta>;
}

export async function postAction(url: string): Promise<void> {
    await fetch(url, {
        method: 'POST',
        headers: { 'X-CSRF-TOKEN': csrf(), Accept: 'application/json' },
        credentials: 'same-origin',
    });
}
