import { useCallback, useEffect, useMemo, useState } from 'react';
import { debounce } from 'lodash';
import { NrOwnershipTrackOrderByField, OrderDir } from 'src/data/globalTypes';
import type { GetOwnershipTracksVariables } from 'src/data/queries/getOwnershipNrTracks/__generated__/getOwnershipTracks';
import type { SongRouteParams } from 'src/pages/songPage/types';

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

const ensureSortByType = (sortBy: string): NrOwnershipTrackOrderByField => {
    if (sortBy === 'createdAt') return NrOwnershipTrackOrderByField.CREATED_AT;
    if (sortBy === 'endDate') return NrOwnershipTrackOrderByField.END_DATE;
    if (sortBy === 'salesStartDate')
        return NrOwnershipTrackOrderByField.SALES_START_DATE;
    return NrOwnershipTrackOrderByField.START_DATE;
};

export const useNrTracksParamsComposer = (
    routeParams: SongRouteParams,
    songId: string,
    pageSize: number,
    page: number
) => {
    const composeQueryParams = useCallback(
        (p: SongRouteParams) => ({
            filters: {
                soundRecordingUuid: songId,
                vendorId: p.selectedAccount,
                upc: p.selectedUpc,
            },
            limit: pageSize,
            offset: page * pageSize,
            orderBy: ensureSortByType(p.orderBy),
            orderDir: ensureSortDirectionType(p.orderDir),
        }),
        [page, pageSize, songId]
    );

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

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

    return queryParams;
};
