import { request, type Page } from './client';
import type { Manga } from './client';

export type Author = {
    id: string;
    name: string;
    created_at: string;
};

/** Returned by `GET /v1/authors/:id` — adds the count of attached mangas. */
export type AuthorWithCount = Author & {
    manga_count: number;
};

export type AuthorMangasPage = {
    items: Manga[];
    page: Page;
};

export type ListAuthorsOptions = {
    search?: string;
    limit?: number;
    offset?: number;
};

export type ListAuthorMangasOptions = {
    limit?: number;
    offset?: number;
};

/** Autocomplete for author pickers. Server sorts by trigram similarity. */
export async function listAuthors(opts: ListAuthorsOptions = {}): Promise<Author[]> {
    const params = new URLSearchParams();
    if (opts.search) params.set('search', opts.search);
    if (opts.limit != null) params.set('limit', String(opts.limit));
    if (opts.offset != null) params.set('offset', String(opts.offset));
    const qs = params.toString();
    return request<Author[]>(`/v1/authors${qs ? `?${qs}` : ''}`);
}

export async function getAuthor(id: string): Promise<AuthorWithCount> {
    return request<AuthorWithCount>(`/v1/authors/${encodeURIComponent(id)}`);
}

export async function listAuthorMangas(
    id: string,
    opts: ListAuthorMangasOptions = {}
): Promise<AuthorMangasPage> {
    const params = new URLSearchParams();
    if (opts.limit != null) params.set('limit', String(opts.limit));
    if (opts.offset != null) params.set('offset', String(opts.offset));
    const qs = params.toString();
    return request<AuthorMangasPage>(
        `/v1/authors/${encodeURIComponent(id)}/mangas${qs ? `?${qs}` : ''}`
    );
}
