import { ref } from 'vue';

export function useCpanelApi(
    serviceId: number,
    area: 'admin' | 'client',
) {
    const loading = ref(false);
    const error = ref<string | null>(null);

    async function get<T extends Record<string, unknown>>(
        resource: string,
        query: Record<string, string> = {},
    ): Promise<T> {
        loading.value = true;
        error.value = null;

        const prefix =
            area === 'admin'
                ? `/admin/cpanel/services/${serviceId}/resources/`
                : `/client/cpanel/services/${serviceId}/resources/`;
        const params = new URLSearchParams(
            Object.fromEntries(
                Object.entries(query).filter(([, value]) => value !== ''),
            ),
        ).toString();

        try {
            const response = await fetch(
                prefix + resource + (params ? `?${params}` : ''),
                {
                    headers: { Accept: 'application/json' },
                    credentials: 'same-origin',
                },
            );
            const body = (await response.json()) as T & { message?: string };

            if (!response.ok) {
                error.value = body.message ?? 'Chargement impossible.';

                return {} as T;
            }

            return body;
        } catch {
            error.value = 'Réseau indisponible.';

            return {} as T;
        } finally {
            loading.value = false;
        }
    }

    return { loading, error, get };
}
