import React, { useEffect, useState } from 'react';
import { Button, Section, SkeletonLoader } from '@theorchard/suite-components';
import { useParams, Link } from 'react-router-dom';
import { ContractAdvanceStatus } from 'src/apollo/definitions/globalTypes';
import { NO_ADVANCE_RESULTS } from 'src/apollo/type-constants/advance';
import {
    useContractAdvancesByStatusList,
    useContractAdvancesPaidList,
    useContractAdvancesPendingList,
    useHistoricalContractAdvances,
} from 'src/apollo/queries/contract-advance';
import ContractAdvancePaidList from 'src/components/contract-advance-list/contract-advance-paid-list';
import ContractAdvancePendingList from 'src/components/contract-advance-list/contract-advance-pending-list';
import ContractAdvanceQueuedList from 'src/components/contract-advance-list/contract-advance-queued-list';
import HistoricalContractAdvanceList from 'src/components/contract-advance-list/historical-contract-advance-list';
import ContractAdvanceSection from 'src/components/contract-advance-list/contract-advance-section';
import RestrictedByAbacusProfileWrapper from 'src/components/restricted-by-abacus-profile-wrapper';
import { CONTRACT_TYPES, DEFAULT_ITEMS_PER_PAGE } from 'src/constants';
import type { ContractAdvanceRequestParams } from 'src/types/abacus-contract-advance';
import { createNewAdvance } from 'src/urls/frontend-royalties';
import './styles.scss';

export interface ContractAdvancesProps {
    accountPaymentCurrency?: string;
    contractType?: string;
    runControllerName?: string | null;
}

export const ContractAdvances: React.FC<ContractAdvancesProps> = ({
    accountPaymentCurrency,
    contractType,
    runControllerName,
}) => {
    const { contractId } = useParams<{ contractId: string }>();
    const params = new URLSearchParams(window.location.search);
    const selectContractAdvance = params.get('selectContractAdvance');

    const createInitialParams = (): ContractAdvanceRequestParams => ({
        contractId,
        limit: DEFAULT_ITEMS_PER_PAGE,
        offset: 0,
    });
    const [pendingAdvancesRequestParams, setPendingAdvancesRequestParams] =
        useState<ContractAdvanceRequestParams>(createInitialParams);
    const [queuedAdvancesRequestParams, setQueuedAdvancesRequestParams] =
        useState<ContractAdvanceRequestParams>(createInitialParams);
    const [paidAdvancesRequestParams, setPaidAdvancesRequestParams] =
        useState<ContractAdvanceRequestParams>(createInitialParams);
    const [
        historicalAdvancesRequestParams,
        setHistoricalAdvancesRequestParams,
    ] = useState<ContractAdvanceRequestParams>({
        contractId,
        limit: 20,
        offset: 0,
    });
    const [historicalAdavancesCount, setHistoricaladavcesCount] = useState(0);

    const {
        data: pendingAdvances,
        error: pendingAdvancesError,
        loading: pendingAdvancesLoading,
    } = useContractAdvancesPendingList(
        contractId,
        DEFAULT_ITEMS_PER_PAGE,
        pendingAdvancesRequestParams.offset
    );

    const {
        data: queuedAdvances,
        error: queuedAdvancesError,
        loading: queuedAdvancesLoading,
    } = useContractAdvancesByStatusList(
        contractId,
        ContractAdvanceStatus.IN_REVIEW,
        DEFAULT_ITEMS_PER_PAGE,
        queuedAdvancesRequestParams.offset
    );

    const {
        data: paidAdvances,
        error: paidAdvancesError,
        loading: paidAdvancesLoading,
    } = useContractAdvancesPaidList(
        contractId,
        DEFAULT_ITEMS_PER_PAGE,
        paidAdvancesRequestParams.offset
    );

    const {
        data: historicalAdvances,
        error: historicalAdvancesError,
        loading: historicalAdvancesLoading,
    } = useHistoricalContractAdvances(
        contractId,
        historicalAdvancesRequestParams.limit,
        historicalAdvancesRequestParams.offset
    );

    const isLoading =
        paidAdvancesLoading &&
        queuedAdvancesLoading &&
        pendingAdvancesLoading &&
        historicalAdvancesLoading;

    useEffect(() => {
        if (!historicalAdvancesLoading)
            setHistoricaladavcesCount(
                historicalAdvances?.abacusContract?.historicalContractAdvances
                    ?.totalCount || 0
            );
    }, [historicalAdvancesLoading]);
    const areAdvancesEmpty =
        pendingAdvances?.abacusContractAdvancesPending?.totalCount == 0 &&
        paidAdvances?.abacusContractAdvancesPaid?.totalCount == 0 &&
        queuedAdvances?.abacusContract?.contractAdvances?.totalCount == 0 &&
        historicalAdavancesCount == 0;

    const shouldShowHistoricalAdvanceSection =
        contractType !== CONTRACT_TYPES.NEIGHBOURING_RIGHTS &&
        runControllerName &&
        !/knr label|knr/i.test(runControllerName) &&
        (historicalAdavancesCount > 0 || historicalAdvancesError);

    return (
        <Section>
            <Section.Header>
                <div className="d-flex flex-column" style={{ width: '100%' }}>
                    <div
                        className="d-flex flex-row align-items-center"
                        style={{ gap: '8px' }}
                    >
                        <Section.Title className="h3">Advances</Section.Title>
                        <RestrictedByAbacusProfileWrapper>
                            <Link
                                to={createNewAdvance(contractId)}
                                data-testid="contract-advance"
                                className="ml-auto"
                            >
                                <Button
                                    className="ContractTermsConditions-customAddButton"
                                    data-testid="add-contract-advance"
                                    disabled={!accountPaymentCurrency}
                                    variant="primary"
                                >
                                    <span>&nbsp;+ Add&nbsp;</span>
                                </Button>
                            </Link>
                        </RestrictedByAbacusProfileWrapper>
                    </div>
                </div>
            </Section.Header>
            {isLoading ? (
                <Section>
                    <Section.Body>
                        <SkeletonLoader shape="line" />
                    </Section.Body>
                </Section>
            ) : areAdvancesEmpty ? (
                <Section.Body>
                    <Section>
                        <Section.Body>
                            <span className="mb-2 text-muted">
                                {NO_ADVANCE_RESULTS}
                            </span>
                        </Section.Body>
                    </Section>
                </Section.Body>
            ) : (
                <Section.Body>
                    <ContractAdvanceSection
                        content={
                            <ContractAdvancePendingList
                                pendingAdvances={pendingAdvances}
                                pendingAdvancesLoading={pendingAdvancesLoading}
                                pendingAdvancesRequestParams={
                                    pendingAdvancesRequestParams
                                }
                                setPendingAdvancesRequestParams={
                                    setPendingAdvancesRequestParams
                                }
                            />
                        }
                        count={
                            pendingAdvances?.abacusContractAdvancesPending
                                ?.totalCount || 0
                        }
                        error={pendingAdvancesError}
                        expanded={selectContractAdvance === 'not-paid'}
                        title="Not Paid"
                    />
                    <Section.Divider />
                    <ContractAdvanceSection
                        content={
                            <ContractAdvanceQueuedList
                                queuedAdvances={
                                    queuedAdvances?.abacusContract
                                        ?.contractAdvances
                                }
                                queuedAdvancesLoading={queuedAdvancesLoading}
                                queuedAdvancesRequestParams={
                                    queuedAdvancesRequestParams
                                }
                                setQueuedAdvancesRequestParams={
                                    setQueuedAdvancesRequestParams
                                }
                            />
                        }
                        count={
                            queuedAdvances?.abacusContract?.contractAdvances
                                ?.totalCount || 0
                        }
                        error={queuedAdvancesError}
                        expanded={selectContractAdvance === 'queued'}
                        title="Queued"
                    />
                    <Section.Divider />
                    <ContractAdvanceSection
                        content={
                            <ContractAdvancePaidList
                                paidAdvances={paidAdvances}
                                paidAdvancesLoading={paidAdvancesLoading}
                                paidAdvancesRequestParams={
                                    paidAdvancesRequestParams
                                }
                                setPaidAdvancesRequestParams={
                                    setPaidAdvancesRequestParams
                                }
                            />
                        }
                        count={
                            paidAdvances?.abacusContractAdvancesPaid
                                ?.totalCount || 0
                        }
                        error={paidAdvancesError}
                        expanded={selectContractAdvance === 'paid'}
                        title="Paid"
                    />
                    {shouldShowHistoricalAdvanceSection && (
                        <>
                            <Section.Divider />
                            <ContractAdvanceSection
                                content={
                                    <HistoricalContractAdvanceList
                                        historicalAdvances={historicalAdvances}
                                        historicalAdvancesLoading={
                                            historicalAdvancesLoading
                                        }
                                        historicalAdvancesRequestParams={
                                            historicalAdvancesRequestParams
                                        }
                                        setHistoricalAdvancesRequestParams={
                                            setHistoricalAdvancesRequestParams
                                        }
                                    />
                                }
                                count={historicalAdavancesCount}
                                error={historicalAdvancesError}
                                expanded={
                                    selectContractAdvance === 'historical'
                                }
                                title="Historical Advances Paid via OA"
                            />
                        </>
                    )}
                </Section.Body>
            )}
        </Section>
    );
};
