import React, { useState } from 'react';
import { Button, HelpTooltip } from '@theorchard/suite-components';
import { useCreateAbacusEvent } from 'src/apollo/mutations/abacus-event';
import { ACCOUNTING_PERIOD_MECHANICALS_EVENT } from 'src/apollo/type-constants/accounting-period';
import { ActionStatusIcon } from 'src/components/shared/action-status-icon';
import {
    CONTRACT_TYPES,
    MECH_DEDUCTIONS_LINK_HELP_MSG,
    USER_FEATURES,
} from 'src/constants';
import { isFeatureFlagEnabled } from 'src/utils/feature-flag';
import { ABACUS_ACTION_STATUSES } from '@theorchard/accounting-apps-shared';
import type { AbacusAccountingPeriodActionState } from 'src/types/accounting-period';

export interface MechanicalDeductionsProps {
    abacusStateId: string | undefined;
    accountingPeriodId: number;
    actionStatus: string;
    isButtonDisabled: boolean;
    updatePeriodState: (
        // eslint-disable-next-line no-unused-vars
        newState: Partial<AbacusAccountingPeriodActionState>[]
    ) => void;
    // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-explicit-any
    setError: (error: any) => void;
    contractType: string;
}

export const MechanicalDeductions: React.FC<MechanicalDeductionsProps> = ({
    abacusStateId,
    accountingPeriodId,
    actionStatus,
    isButtonDisabled,
    updatePeriodState,
    setError,
    contractType,
}) => {
    const [isSubmitting, setIsSubmitting] = useState(false);
    const createAbacusEvent = useCreateAbacusEvent();

    const isFeatureEnabled = isFeatureFlagEnabled(
        USER_FEATURES.ABACUS_CONTRACT_MECHANICAL_DEDUCTIONS_CALC
    );

    const isComplete = actionStatus === ABACUS_ACTION_STATUSES.COMPLETE;
    const isRunning = actionStatus === ABACUS_ACTION_STATUSES.RUNNING;

    const handleClick = async () => {
        setIsSubmitting(true);

        try {
            if (!isFeatureEnabled) {
                updatePeriodState([
                    {
                        abacusStateId,
                        actionStatus: ABACUS_ACTION_STATUSES.COMPLETE,
                    },
                ]);
                return;
            }

            updatePeriodState([
                {
                    abacusStateId,
                    actionStatus: ABACUS_ACTION_STATUSES.RUNNING,
                },
            ]);

            await createAbacusEvent({
                variables: {
                    eventName: ACCOUNTING_PERIOD_MECHANICALS_EVENT.EVENT_NAME,
                    targetType: ACCOUNTING_PERIOD_MECHANICALS_EVENT.TARGET_TYPE,
                    targetId: accountingPeriodId,
                },
            });
        } catch (err) {
            setError(err);
            updatePeriodState([
                {
                    abacusStateId,
                    actionStatus: ABACUS_ACTION_STATUSES.ERROR,
                },
            ]);
        } finally {
            setIsSubmitting(false);
        }
    };

    if (contractType === CONTRACT_TYPES.NEIGHBOURING_RIGHTS) return null;

    return (
        <div className="MechanicalDeductions">
            <Button
                data-testid="prepMechDeductionBtn"
                disabled={
                    isButtonDisabled || isComplete || isSubmitting || isRunning
                }
                id="prepMechDeductionBtn"
                onClick={handleClick}
                variant="quartenary"
            >
                {isComplete ? (
                    <span className="MechDeductions">
                        <ActionStatusIcon
                            actionStatus={ABACUS_ACTION_STATUSES.COMPLETE}
                        />{' '}
                        Mech Deductions
                    </span>
                ) : isRunning ? (
                    <span className="MechDeductions">
                        <ActionStatusIcon
                            actionStatus={ABACUS_ACTION_STATUSES.RUNNING}
                        />{' '}
                        Preparing Mech Deductions
                    </span>
                ) : (
                    'PREP MECH DEDUCTIONS'
                )}
            </Button>

            {isButtonDisabled && !isComplete && (
                <span data-testid="mechDeductionsHelpIcon">
                    <HelpTooltip
                        id="help-id"
                        message={MECH_DEDUCTIONS_LINK_HELP_MSG}
                    />
                </span>
            )}
        </div>
    );
};
