import React, { useState } from 'react';
import { Alert, Button, FullscreenModal } from '@theorchard/suite-components';
import { isArray } from 'lodash-es';
import { useHistory } from 'react-router-dom';
import { CONTRACT_LIFECYCLE_MODAL_SCREENS } from 'src/apollo/type-constants/contract';
import { ContractLifecycleCurrentPeriod } from 'src/components/contract-lifecycle-create/contract-lifecycle-current-period';
import { ContractLifecycleFullscreenModalTitle } from 'src/components/contract-lifecycle-create/contract-lifecycle-fullscreen-modal-title';
import { ContractLifecycleGeneralContractInformationScreen } from 'src/components/contract-lifecycle-create/contract-lifecycle-general-contract-information-screen';
import { ContractLifecycleSubsequentPeriod } from 'src/components/contract-lifecycle-create/contract-lifecycle-subsequent-period';
import { useSaveHandler } from 'src/hooks/create-contract-with-lifecycle';
import {
    getContractDetail,
    getContractList,
} from 'src/urls/frontend-royalties';
import type { GetAccountsListQuery } from 'src/apollo/queries/account/__generated__/get-accounts-list';
import type {
    Contract,
    ContractLifecycle,
    ContractLifecycleSchedule,
} from 'src/types/abacus-contract-lifecycle';

type AbacusContract = NonNullable<
    NonNullable<GetAccountsListQuery['abacusAccounts']['items'][0]>['contracts']
>[0];

export const ContractLifecycleFullscreenModal: React.FC = () => {
    const [contract, setContract] = useState<Contract>({
        accountId: undefined,
        contractName: null,
        contractType: null,
        isPrimaryContract: false,
        referencePaymentEntityId: null,
        referenceSigningEntityId: null,
        referenceSapProfitCenterId: null,
        executionDate: null,
        runControllerId: null,
        generalNote: null,
    });
    const [contractLifecycle, setContractLifecycle] =
        useState<ContractLifecycle>({
            lifecycleTermStart: null,
        });
    const [contractLifecycleSchedules, setContractLifecycleSchedules] =
        useState<ContractLifecycleSchedule[]>([]);
    const [paymentEntityName, setPaymentEntityName] = useState<string | null>(
        null
    );
    const [accountName, setAccountName] = useState<string | null>(null);
    const [hasCollectionPeriod, setHasCollectionPeriod] =
        useState<boolean>(false);
    const [modalScreen, setModalScreen] = useState<string>(
        CONTRACT_LIFECYCLE_MODAL_SCREENS.GENERAL_INFORMATION
    );
    const [serverError, setServerError] = useState<string | null>(null);
    const [existingPrimaryContract, setExistingPrimaryContract] =
        useState<AbacusContract | null>(null);
    const history = useHistory();
    const saveHandler = useSaveHandler();

    const handleSave = async (isSameRenewalRulesChecked: boolean = false) => {
        try {
            const contractId = await saveHandler(
                accountName,
                contract,
                contractLifecycle,
                contractLifecycleSchedules,
                hasCollectionPeriod,
                isSameRenewalRulesChecked,
                paymentEntityName,
                existingPrimaryContract?.contractId || ''
            );

            history.push(getContractDetail(contractId));
        } catch (e) {
            if (e instanceof Error)
                setServerError(
                    `Error ${e.message}, Failed to create contract.`
                );

            if (isArray(e))
                setServerError(
                    `Error ${JSON.stringify(e[0])}, Failed to create contract.`
                );
            else
                setServerError(
                    `Error ${String(e)}, Failed to create contract.`
                );
        }
    };

    return (
        <FullscreenModal>
            {serverError && (
                <>
                    <Alert
                        variant="error"
                        text={serverError}
                        className="error-alert"
                    />
                </>
            )}
            <FullscreenModal.Header title="Create Contract">
                <Button
                    variant="quartenary"
                    className="ContractLifecycleFullScreenModal-CancelButton"
                    onClick={() => history.push(getContractList)}
                    data-testid="cancelButton"
                >
                    Cancel
                </Button>
            </FullscreenModal.Header>
            <ContractLifecycleFullscreenModalTitle modalScreen={modalScreen} />
            <FullscreenModal.Body>
                <ContractLifecycleGeneralContractInformationScreen
                    setContract={setContract}
                    contract={contract}
                    contractLifecycleSchedules={contractLifecycleSchedules}
                    existingPrimaryContract={existingPrimaryContract}
                    hasCollectionPeriod={hasCollectionPeriod}
                    setContractLifecycleSchedules={
                        setContractLifecycleSchedules
                    }
                    setExistingPrimaryContract={setExistingPrimaryContract}
                    setHasCollectionPeriod={setHasCollectionPeriod}
                    setModalScreen={setModalScreen}
                    setPaymentEntityName={setPaymentEntityName}
                    setAccountName={setAccountName}
                    isVisible={
                        CONTRACT_LIFECYCLE_MODAL_SCREENS.GENERAL_INFORMATION ===
                        modalScreen
                    }
                    saveHandler={handleSave}
                />
                <ContractLifecycleCurrentPeriod
                    isEditForm
                    contractLifecycle={contractLifecycle}
                    contractLifecycleSchedules={contractLifecycleSchedules}
                    saveHandler={handleSave}
                    setContractLifecycle={setContractLifecycle}
                    setContractLifecycleSchedules={
                        setContractLifecycleSchedules
                    }
                    setServerError={setServerError}
                    setModalScreen={setModalScreen}
                    isVisible={
                        CONTRACT_LIFECYCLE_MODAL_SCREENS.CURRENT_PERIOD ===
                        modalScreen
                    }
                />
                <ContractLifecycleSubsequentPeriod
                    contractLifecycle={contractLifecycle}
                    contractLifecycleSchedules={contractLifecycleSchedules}
                    saveHandler={handleSave}
                    setContractLifecycleSchedules={
                        setContractLifecycleSchedules
                    }
                    setServerError={setServerError}
                    setModalScreen={setModalScreen}
                    isVisible={
                        CONTRACT_LIFECYCLE_MODAL_SCREENS.SUBSEQUENT_PERIOD ===
                        modalScreen
                    }
                />
            </FullscreenModal.Body>
        </FullscreenModal>
    );
};
