import React from 'react';
import moment from 'moment';
import { formatMessage } from '@orchard/frontend-localization';
import ConfirmModal from 'src/components/confirm-modal/confirm-modal';
import { useCreateCollaboratorTransactionsMutation } from 'src/mutations/create-collaborator-transactions';
import { ReportWithCollaborator } from 'src/queries/reports-with-collaborators';
import { CollaboratorTransactionType } from 'src/__definitions__/globalTypes';
import { BACKEND_ERROR_CODES } from 'src/constants';
import messages from './i18n';

const CLASS_NAME = 'AddToRoyaltiesModal';

type Props = {
    onCancel(): void;
    onSuccess(): void;
    reportsToAdd: ReportWithCollaborator[];
    hasInvalidReportsSelected: boolean;
    reportRunUuid: string;
};

const AddToRoyaltiesModal: React.FC<Props> = ({ onCancel, onSuccess, reportsToAdd, hasInvalidReportsSelected, reportRunUuid }) => {
    const [
        createCollaboratorTransactionsMutation,
        { error: createCollaboratorTransactionsError, loading: createCollaboratorTransactionsLoading }
    ] = useCreateCollaboratorTransactionsMutation({ reportRunUuid });

    const handleConfirm = async () => {
        if (!reportsToAdd.length)
            return onCancel();

        const mutationInput = reportsToAdd.map((report) => (
            {
                collaboratorId: report.collaborator!.id,
                reportId: parseInt(report.id, 10),
                type: CollaboratorTransactionType.REVENUE,
                originalAmount: report.amount!,
                currency: report.currency,
                date: moment.utc(report.generatedDateTime).format('YYYY-MM-DD'),
                description: report.fileName,
            }
        ));

        const response = await createCollaboratorTransactionsMutation({
            variables: {
                input: mutationInput,
            },
        });

        if (response.data?.createCollaboratorTransactions) onSuccess();
    };

    const errorMessage = createCollaboratorTransactionsError?.graphQLErrors[0]?.extensions?.response?.body?.code
            === BACKEND_ERROR_CODES.UNEXPECTED_CURRENCY
        ? formatMessage(messages.reportCurrencyDoesNotMatchCollaboratorBalance)
        : formatMessage(messages.genericError);

    return (
        <ConfirmModal
            onCancel={ onCancel }
            onConfirm={ handleConfirm }
            isError={ Boolean(createCollaboratorTransactionsError) }
            errorMessage={ errorMessage }
            header={ formatMessage(messages.addToRoyaltiesModalHeader, { count: reportsToAdd.length }) }
            isLoading={ createCollaboratorTransactionsLoading }
            saveButtonVariant="loading"
            confirmLabel={ formatMessage(messages.yesAddToRoyalties) }
            body={ (
                <>
                    <p>{ formatMessage(messages.addToRoyaltiesModalBody) }</p>
                    { hasInvalidReportsSelected && (
                        <p className={ `${CLASS_NAME}-invalid-selected-warning` }>
                            { formatMessage(messages.failedOrIncompleteReportsSelectedWarning) }
                        </p>
                    ) }
                </>
            ) }
        />
    );

};

export default AddToRoyaltiesModal;
