import { useCallback, useEffect, useMemo, useState } from 'react';
import { debounce } from 'lodash';
import {
    OrderDir,
    OwnershipNrSoundRecordingOrderByField,
} from 'src/data/globalTypes';
import type { CatalogRouteParams } from '../catalogPage';
import type { GetOwnershipNrSoundRecordingsVariables } from 'src/data/queries/getOwnershipNrSoundRecordings/__generated__/getOwnershipNrSoundRecordings';

const ensureSortDirectionType = (direction: string): OrderDir | undefined => {
    if (direction === 'desc') return OrderDir.DESC;
    if (direction === 'asc') return OrderDir.ASC;
    return undefined;
};

const ensureSortByType = (
    sortBy: string
): OwnershipNrSoundRecordingOrderByField | undefined => {
    if (sortBy === 'lastModifiedAt')
        return OwnershipNrSoundRecordingOrderByField.LAST_MODIFIED;
    if (sortBy === 'srNameVersion')
        return OwnershipNrSoundRecordingOrderByField.NAME_VERSION;
    return undefined;
};

export const useSoundRecordingParamsComposer = (
    page: number,
    pageSize: number,
    routeParams: CatalogRouteParams
) => {
    const composeQueryParams = useCallback(
        (p: CatalogRouteParams) => ({
            filters: {
                reference: p.selectedUpc ? null : true,
                isrc: p.selectedIsrc,
                recordingTitle: p.selectedRecordingTitle,
                participantId: p.selectedParticipant,
                account: p.selectedAccount,
                upc: p.selectedUpc,
            },
            limit: pageSize,
            offset: page * pageSize,
            orderBy: ensureSortByType(p.orderBy),
            orderDir: ensureSortDirectionType(p.orderDir),
        }),
        [page, pageSize]
    );

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

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

    return queryParams;
};
