import React from 'react';
import { Section, useFullscreenModal } from '@theorchard/suite-components';
import { useHistory } from 'react-router-dom';
import { selectTaxFormRoute } from 'src/urls/frontend-royalties';
import { COUNTRY_NAMES } from './components/taxFormInfoCompleted/constants';
import { getOnDateString } from './helpers';
import { TaxFormInfoViewType } from './tax-form-info';
import TaxFormInfoHeaderSection from './tax-form-info-header-section';
import { TaxFormInfoSubsection } from './tax-form-info-subsection';
import type { SubsectionDataType } from './tax-form-info-subsection';
import type { GlyphName12PX } from '@theorchard/suite-icons';
import type { GetAccountPayeeTaxFormInfoESQuery } from 'src/apollo/queries/__generated__/account-payee-tax-form-info-es';
import type { GetAccountFullDetailQuery } from 'src/apollo/queries/account/__generated__/get-account-full-detail';
import { isCertificateExpiringSoon } from '@theorchard/accounting-apps-shared';

type ActionStates = NonNullable<
    NonNullable<GetAccountFullDetailQuery['abacusAccount']>['accountPayee']
>['actionStates'][0];

export interface TaxFormInfoTopSectionPropTypes {
    accountId: string;
    accountPayeeId: string | undefined;
    countryOfTaxResidence?: string | null;
    expirationDate?: string | null;
    isTaxFormInfoEmpty: boolean;
    isNonSpanishTaxResident: boolean;
    taxFormInfoViewType: TaxFormInfoViewType | undefined;
    taxEligibilityItem: ActionStates | undefined;
    taxInfoESData?: GetAccountPayeeTaxFormInfoESQuery;
    canEditUSTaxInfo?: boolean;
    isOrchardESAccount: boolean;
}

interface Content {
    enableEdit?: boolean;
    glyphIcon?: {
        name: GlyphName12PX;
        className: 'error' | 'warning' | 'success';
    };
    headerSecondaryText?: string;
    showHeaderButtons?: boolean;
    subsection?: SubsectionDataType;
}

export const CLASS_NAME = 'TaxFormInfoTopSection';

const TaxFormInfoTopSection: React.FC<TaxFormInfoTopSectionPropTypes> = ({
    accountId,
    accountPayeeId,
    countryOfTaxResidence,
    expirationDate,
    isTaxFormInfoEmpty,
    isNonSpanishTaxResident,
    taxFormInfoViewType,
    taxEligibilityItem,
    taxInfoESData,
    canEditUSTaxInfo,
    isOrchardESAccount,
}) => {
    const history = useHistory();
    const { open } = useFullscreenModal();

    const openModal = () => {
        open(() => history.push(selectTaxFormRoute(accountId)));
    };
    const taxEligibilityStateId = taxEligibilityItem?.abacusStateId;

    const lastModifiedOn = getOnDateString(taxEligibilityItem?.lastModified);
    const expiredOn = getOnDateString(expirationDate);

    const accountTaxInfoId =
        taxInfoESData?.abacusAccount?.accountTaxInfo?.accountTaxInfoId;

    const canEdit =
        canEditUSTaxInfo ||
        (isOrchardESAccount &&
            countryOfTaxResidence !== COUNTRY_NAMES.ESP.ISO3);

    const getContent = (): Content => {
        const certificateOfResidenceExpirationDate =
            taxInfoESData?.abacusAccount?.accountTaxInfo
                ?.certificateOfResidenceExpirationDate;
        switch (taxFormInfoViewType) {
            case TaxFormInfoViewType.PENDING:
                return {
                    glyphIcon: {
                        name: 'warning',
                        className: 'warning',
                    },
                    headerSecondaryText:
                        'Tax information has not been added yet',
                    showHeaderButtons: canEdit,
                };
            case TaxFormInfoViewType.REJECTED:
                return {
                    glyphIcon: {
                        name: 'close',
                        className: 'error',
                    },
                    subsection: {
                        title: `Tax form rejected ${lastModifiedOn}`,
                        subtitle:
                            'Please request an updated tax form from the client.',
                        notes: taxEligibilityItem?.message,
                        variant: 'error',
                    },
                };
            case TaxFormInfoViewType.EXPIRED:
                return isNonSpanishTaxResident
                    ? {
                          glyphIcon: {
                              name: 'warning',
                              className: 'warning',
                          },
                          subsection: {
                              title: '',
                              subtitle: (
                                  <>
                                      Account is not eligible for payment as the{' '}
                                      <b>Certificate End Date</b> expired on{' '}
                                      {certificateOfResidenceExpirationDate}
                                  </>
                              ),
                              variant: 'error',
                          },
                          enableEdit: canEdit,
                      }
                    : {
                          glyphIcon: {
                              name: 'warning',
                              className: 'warning',
                          },
                          subsection: {
                              title: `Tax form expired ${expiredOn}`,
                              subtitle:
                                  'Please request an updated tax form from the client.',
                              variant: 'warn',
                          },
                      };
            case TaxFormInfoViewType.COMPLETED:
                return isNonSpanishTaxResident &&
                    isCertificateExpiringSoon(
                        certificateOfResidenceExpirationDate
                    )
                    ? {
                          glyphIcon: {
                              name: 'warning',
                              className: 'warning',
                          },
                          subsection: {
                              title: '',
                              subtitle: (
                                  <>
                                      <b>Certificate of Residence</b> will
                                      expire on{' '}
                                      {certificateOfResidenceExpirationDate}
                                  </>
                              ),
                              variant: 'warn',
                          },
                          enableEdit: canEdit,
                      }
                    : {
                          glyphIcon: {
                              name: 'check',
                              className: 'success',
                          },
                          enableEdit: canEdit,
                      };
            default:
                return {};
        }
    };

    const content = getContent();
    const {
        enableEdit,
        glyphIcon,
        showHeaderButtons,
        headerSecondaryText,
        subsection,
    } = content;

    return (
        <Section className={CLASS_NAME} testId={CLASS_NAME}>
            <Section.Header>
                <TaxFormInfoHeaderSection
                    className={CLASS_NAME}
                    accountId={accountId}
                    accountPayeeId={accountPayeeId}
                    countryOfTaxResidence={countryOfTaxResidence}
                    taxEligibilityStateId={taxEligibilityStateId}
                    showHeaderButtons={showHeaderButtons}
                    enableEdit={enableEdit}
                    glyphIcon={glyphIcon}
                    onOpenModal={openModal}
                    isNonSpanishTaxResident={isNonSpanishTaxResident}
                    accountTaxInfoId={accountTaxInfoId}
                    taxInfoESData={taxInfoESData}
                />
                {headerSecondaryText && <span>{headerSecondaryText}</span>}
            </Section.Header>
            {subsection && (
                <Section.Body>
                    <TaxFormInfoSubsection
                        accountId={accountId}
                        accountPayeeId={accountPayeeId}
                        isTaxFormInfoEmpty={isTaxFormInfoEmpty}
                        subsection={subsection}
                        taxEligibilityStateId={taxEligibilityStateId}
                        isNonSpanishTaxResident={isNonSpanishTaxResident}
                    />
                </Section.Body>
            )}
        </Section>
    );
};

export default TaxFormInfoTopSection;
