import { useToast } from '@theorchard/suite-components';
import { AbacusContractLifecycleScheduleRenewalType } from 'src/apollo/definitions/globalTypes';
import {
    useCreateContract,
    useCreateContractWithLifecycle,
    useUpdateContract,
} from 'src/apollo/mutations/contract';
import { formatContractLifecycleSchedules } from 'src/utils/contract-lifecycle-schedule';
import type {
    AbacusContractInput,
    AbacusContractLifecycleInput,
    AbacusContractLifecycleScheduleInput,
} from 'src/apollo/definitions/globalTypes';
import type {
    Contract,
    ContractLifecycle,
    ContractLifecycleSchedule,
} from 'src/types/abacus-contract-lifecycle';

export const useSaveHandler = () => {
    const createContract = useCreateContract();
    const createContractWithLifecycle = useCreateContractWithLifecycle();
    const updateContract = useUpdateContract('');
    const toast = useToast();

    const saveHandler = async (
        accountName: string | null,
        contract: Contract,
        contractLifecycle: ContractLifecycle,
        contractLifecycleSchedules: ContractLifecycleSchedule[],
        hasCollectionPeriod: boolean,
        isSameRenewalRulesChecked: boolean,
        paymentEntityName: string | null,
        existingPrimaryContractId: string
    ) => {
        const lifecycleSchedules =
            contractLifecycleSchedules as AbacusContractLifecycleScheduleInput[];

        if (isSameRenewalRulesChecked) {
            if (
                lifecycleSchedules[0].renewalType ===
                AbacusContractLifecycleScheduleRenewalType.RENEW_PERIODICALLY
            ) {
                lifecycleSchedules[1] = {
                    ...lifecycleSchedules[0],
                };
            }
        }

        let contractId;

        if (existingPrimaryContractId)
            await updateContract({
                variables: {
                    contractId: existingPrimaryContractId,
                    isPrimaryContract: false,
                },
            });

        if (
            lifecycleSchedules.length > 0 &&
            lifecycleSchedules[0].renewalType
        ) {
            const formattedLifecycleSchedules =
                formatContractLifecycleSchedules(
                    lifecycleSchedules,
                    contract.contractType!,
                    hasCollectionPeriod
                );
            const variables = {
                contract: contract as AbacusContractInput,
                lifecycle: contractLifecycle as AbacusContractLifecycleInput,
                lifecycleSchedules: formattedLifecycleSchedules,
            };
            const { data } = await createContractWithLifecycle({
                variables,
            });
            contractId = data?.abacusCreateContractWithLifecycles?.contractId;
        } else {
            const variables = contract as AbacusContractInput;
            const { data } = await createContract({ variables });
            contractId = data?.abacusCreateContract?.contractId;
        }

        if (paymentEntityName && accountName) {
            toast(
                `The ${accountName} account Paid By was set to ${paymentEntityName} automatically`
            );
        } else {
            toast(`Contract ${contractId} created successfully`);
        }

        return contractId;
    };

    return saveHandler;
};
