import { useCallback, useEffect, useMemo, useState } from 'react';
import { debounce } from 'lodash';
import { NrContributionSearchOrderByField } from 'src/data/globalTypes';
import {
    ensurePriorityType,
    ensureSortDirectionType,
} from 'src/utils/formatter';
import type { GetContributionsVariables } from 'src/data/queries/contributions/__generated__/GetContributions';
import type { CatalogRouteParams } from 'src/pages/catalogPage/catalogPage';

const ensureSortByType = (
    sortBy: string
): NrContributionSearchOrderByField | undefined => {
    if (sortBy === 'primaryArtist')
        return NrContributionSearchOrderByField.PRIMARY_ARTIST;
    if (sortBy === 'lastModifiedAt')
        return NrContributionSearchOrderByField.LAST_MODIFIED;
    if (sortBy === 'srNameVersion')
        return NrContributionSearchOrderByField.NRSR_NAME_VERSION;
    if (sortBy === 'firstReleaseYear')
        return NrContributionSearchOrderByField.RELEASE_YEAR;
    return undefined;
};

export const useContributionsParamsComposer = (
    page: number,
    pageSize: number,
    routeParams: CatalogRouteParams
) => {
    const composeQueryParams = useCallback(
        (p: CatalogRouteParams) => ({
            limit: pageSize,
            offset: page * pageSize,
            filters: {
                account: p.selectedAccount,
                isrc: p.selectedIsrc,
                participantId: p.selectedParticipant,
                priority: p.selectedPriority
                    ? ensurePriorityType(p.selectedPriority)
                    : undefined,
                recordingTitle: p.selectedRecordingTitle,
                contributorId: p.selectedContributor,
                soundRecordingId: p.selectedRecordingId,
            },
            orderBy: ensureSortByType(p.orderBy),
            orderDir: ensureSortDirectionType(p.orderDir),
        }),
        [page, pageSize]
    );

    const [queryParams, setQueryParams] = useState<GetContributionsVariables>(
        composeQueryParams(routeParams)
    );
    const updateQueryParams = useMemo(
        () =>
            debounce(
                (p: CatalogRouteParams) =>
                    setQueryParams(composeQueryParams(p)),
                300
            ),
        [composeQueryParams]
    );

    useEffect(() => {
        updateQueryParams(routeParams);
    }, [updateQueryParams, routeParams]);

    return queryParams;
};
