import { keepPreviousData, useQuery } from '@tanstack/react-query';

export interface UserListItem {
    id: number;
    name: string;
    email: string;
    is_active: boolean;
    roles: string[];
    created_at: string;
    updated_at: string;
}

export interface PaginatedUsers {
    data: UserListItem[];
    current_page: number;
    last_page: number;
    per_page: number;
    total: number;
}

export interface UsersQueryParams {
    page: number;
    search: string;
}

export interface UsersQueryResult {
    users: UserListItem[];
    pagination: {
        currentPage: number;
        lastPage: number;
        perPage: number;
        total: number;
    };
}

interface LaravelPaginator<T> {
    data: T[];
    current_page: number;
    last_page: number;
    per_page: number;
    total: number;
}

interface RawUser {
    id: number;
    name: string;
    email: string;
    is_active: boolean;
    roles: string[];
    created_at: string;
    updated_at: string;
}

interface RawLaravelPaginator {
    data: RawUser[];
    current_page: number;
    last_page: number;
    per_page: number;
    total: number;
}

async function fetchUsersPage(url: string): Promise<RawLaravelPaginator> {
    const response = await fetch(url, {
        headers: {
            Accept: 'application/json',
            'X-Requested-With': 'XMLHttpRequest',
        },
        credentials: 'same-origin',
    });

    if (!response.ok) {
        throw new Error(`Error al cargar usuarios (${response.status})`);
    }

    return response.json() as Promise<RawLaravelPaginator>;
}

function buildUrl(baseUrl: string, params: UsersQueryParams): string {
    const search = new URLSearchParams();
    if (params.page > 1) {
        search.set('page', String(params.page));
    }
    if (params.search.trim() !== '') {
        search.set('search', params.search.trim());
    }
    const query = search.toString();
    return query === '' ? baseUrl : `${baseUrl}?${query}`;
}

export function useUsers(initialUrl: string, params: UsersQueryParams) {
    const url = buildUrl(initialUrl, params);

    return useQuery({
        queryKey: ['users', params.page, params.search],
        queryFn: () => fetchUsersPage(url),
        placeholderData: keepPreviousData,
    });
}

export function mapToQueryResult(raw: LaravelPaginator<RawUser>): UsersQueryResult {
    return {
        users: raw.data,
        pagination: {
            currentPage: raw.current_page,
            lastPage: raw.last_page,
            perPage: raw.per_page,
            total: raw.total,
        },
    };
}
