import React from 'react';
import { Alert, SkeletonLoader } from '@theorchard/suite-components';
import './styles.scss';
import { useFeatureFlag, useIdentity } from '@theorchard/suite-frontend';
import { get, isEmpty } from 'lodash-es';
import { useAccountPayeeTaxFormInfoESQuery } from 'src/apollo/queries/account-payee-tax-form-info-es';
import { useCanPerformAction } from 'src/apollo/queries/can-perform';
import {
    PERMISSIONS_ACTIONS,
    PERMISSIONS_RESOURCE_TYPES,
    USA_ISO_COUNTRY_CODE,
    USER_FEATURES,
} from 'src/constants';
import AccountTaxInfoDetail from '../account-detail/account-tax-info-detail';
import { COUNTRY_NAMES } from './components/taxFormInfoCompleted/constants';
import TaxFormInfoCompleted from './components/taxFormInfoCompleted/tax-form-info-completed';
import TaxFormInfoTopSection from './tax-form-info-top-section';
import type { GetAccountFullDetailQuery } from 'src/apollo/queries/account/__generated__/get-account-full-detail';
// eslint-disable-next-line import/order
import {
    ABACUS_ACTION_STATUSES,
    ABACUS_ACTIONS,
    PAYMENT_ENTITY_NAMES,
    PAYMENT_SERVICES,
} from '@theorchard/accounting-apps-shared';
import type {
    AccountDetailAccountTaxInfo,
    AccountDetailAccountTaxInfoHistory,
} from 'src/types/abacus-account';

export interface TaxFormInfoPropTypes {
    accountFullDetail: GetAccountFullDetailQuery;
    accountFullDetailQueryLoading: boolean;
}

export enum TaxFormInfoViewType {
    DEFAULT = 'default',
    PENDING = 'pending',
    REJECTED = 'rejected',
    EXPIRED = 'expired',
    COMPLETED = 'completed',
}

const CLASS_NAME = 'TaxFormInfo';

const TaxFormInfo: React.FC<TaxFormInfoPropTypes> = ({
    accountFullDetail,
    accountFullDetailQueryLoading,
}) => {
    const isFFAWALMigrationEnabled = useFeatureFlag(
        USER_FEATURES.TAP_AWAL_PAYONEER_MIGRATION
    );
    const accountDetails = accountFullDetail?.abacusAccount;
    const accountId = accountDetails?.accountId;
    const paymentType = accountDetails?.accountPaymentTerm?.paymentType;
    const accountPayee = accountDetails?.accountPayee;
    const accountPayeeId = accountPayee?.accountPayeeId;
    // FF on: canonical paymentService (DB-backed). FF off: legacy resolver.
    const paymentServiceValue = isFFAWALMigrationEnabled
        ? accountPayee?.referencePaymentType?.paymentService
        : paymentType;
    const isWhitelabel =
        (paymentServiceValue ?? '').toUpperCase() ===
        PAYMENT_SERVICES.PAYONEER_WHITELABEL;
    const countryOfTaxResidence =
        accountDetails?.accountTaxInfo?.countryOfTaxResidence;
    const paymentEntity = accountDetails?.accountPaymentTerm?.paymentEntity;
    const taxExperienceCountry = paymentEntity?.countryOfTaxReporting || '';
    const taxEligibility = accountPayee?.actionStates.filter(
        (item: { actionName: string }) =>
            item.actionName === ABACUS_ACTIONS.TAX_ELIGIBILITY
    );
    const accountPayeeTaxFormInfo = accountPayee?.accountPayeeTaxFormInfo;
    const expirationDate = accountPayeeTaxFormInfo?.expirationDate;
    const taxEligibilityItem = taxEligibility && taxEligibility[0];
    const paymentEntityName = paymentEntity?.paymentEntityName;

    const taxEligibilityStatus = taxEligibilityItem?.actionStatus;

    const isTaxFormInfoEmpty = isEmpty(accountPayeeTaxFormInfo);

    const isOrchardESAccount =
        paymentEntityName === PAYMENT_ENTITY_NAMES.ORCHARD_ES;
    const isNonSpanishTaxResident =
        isOrchardESAccount && countryOfTaxResidence !== COUNTRY_NAMES.ESP.ISO3;

    const identity = useIdentity();

    const { data: canEditTaxInfo, loading: canPerformActionQueryLoading } =
        useCanPerformAction(
            identity.id,
            PERMISSIONS_ACTIONS.EDIT,
            PERMISSIONS_RESOURCE_TYPES.TAX_INFO
        );
    if (!accountId)
        return (
            <div className={CLASS_NAME}>
                <Alert title="Error" text="Account not found" variant="error" />
            </div>
        );
    const canEditUSTaxInfo =
        canEditTaxInfo &&
        (isFFAWALMigrationEnabled
            ? isWhitelabel && taxExperienceCountry === USA_ISO_COUNTRY_CODE
            : paymentEntityName === PAYMENT_ENTITY_NAMES.ORCHARD_US);
    const { data: taxInfoESData, loading: taxInfoESQueryLoading } =
        useAccountPayeeTaxFormInfoESQuery({
            accountId,
            skip: !accountId || !isOrchardESAccount,
        });

    if (
        taxInfoESQueryLoading ||
        accountFullDetailQueryLoading ||
        canPerformActionQueryLoading
    ) {
        return <SkeletonLoader numberOfItems={5} vertical />;
    }

    const taxFormInfoViewType = (): TaxFormInfoViewType | undefined => {
        if (
            isWhitelabel &&
            paymentEntityName === PAYMENT_ENTITY_NAMES.ORCHARD_ES &&
            isNonSpanishTaxResident &&
            taxEligibilityStatus === ABACUS_ACTION_STATUSES.REJECTED
        ) {
            return TaxFormInfoViewType.EXPIRED;
        }

        // Entities without a non-US whitelabel tax-form UI in abacus.
        const isExcludedEntity =
            paymentEntityName &&
            [
                PAYMENT_ENTITY_NAMES.ORCHARD_UK,
                PAYMENT_ENTITY_NAMES.ORCHARD_NO,
                PAYMENT_ENTITY_NAMES.AWAL_UK,
            ].includes(paymentEntityName);
        const isUSA = taxExperienceCountry === USA_ISO_COUNTRY_CODE;
        const isUSAAllowed = isFFAWALMigrationEnabled && isUSA;

        if (
            isWhitelabel &&
            paymentEntityName &&
            (isUSAAllowed || !isExcludedEntity)
        ) {
            if (
                taxEligibilityStatus === ABACUS_ACTION_STATUSES.RUNNING ||
                taxEligibilityStatus === ABACUS_ACTION_STATUSES.INIT
            ) {
                return TaxFormInfoViewType.PENDING;
            }
            if (
                taxEligibilityStatus === ABACUS_ACTION_STATUSES.REJECTED &&
                expirationDate &&
                new Date(expirationDate) <= new Date()
            ) {
                return TaxFormInfoViewType.EXPIRED;
            }
            if (taxEligibilityStatus === ABACUS_ACTION_STATUSES.REJECTED) {
                return TaxFormInfoViewType.REJECTED;
            }
            if (taxEligibilityStatus === ABACUS_ACTION_STATUSES.COMPLETE) {
                return TaxFormInfoViewType.COMPLETED;
            }
        }
        return TaxFormInfoViewType.DEFAULT;
    };
    const viewType = taxFormInfoViewType();
    return (
        <div className={CLASS_NAME} data-testid={CLASS_NAME}>
            <TaxFormInfoTopSection
                accountId={accountId}
                accountPayeeId={accountPayeeId}
                countryOfTaxResidence={countryOfTaxResidence}
                expirationDate={expirationDate}
                isNonSpanishTaxResident={isNonSpanishTaxResident}
                isTaxFormInfoEmpty={isTaxFormInfoEmpty}
                taxFormInfoViewType={viewType}
                taxEligibilityItem={taxEligibilityItem}
                taxInfoESData={taxInfoESData}
                canEditUSTaxInfo={canEditUSTaxInfo}
                isOrchardESAccount={isOrchardESAccount}
            />
            {(viewType === TaxFormInfoViewType.COMPLETED ||
                (viewType === TaxFormInfoViewType.EXPIRED &&
                    isNonSpanishTaxResident)) && (
                <TaxFormInfoCompleted
                    accountId={accountId}
                    paymentEntityName={paymentEntityName}
                    taxInfoESData={taxInfoESData}
                    canEditTaxInfo={canEditTaxInfo}
                    canEditUSTaxInfo={canEditUSTaxInfo}
                />
            )}
            {accountDetails && viewType === TaxFormInfoViewType.DEFAULT && (
                <AccountTaxInfoDetail
                    accountTaxInfo={
                        accountDetails.accountTaxInfo as NonNullable<AccountDetailAccountTaxInfo>
                    }
                    accountTaxInfoHistory={
                        accountDetails.accountTaxInfoHistory as NonNullable<AccountDetailAccountTaxInfoHistory>
                    }
                    actionStates={get(
                        accountDetails,
                        'accountPayee.actionStates',
                        []
                    )}
                />
            )}
        </div>
    );
};

export default TaxFormInfo;
