import React from 'react';
import { GridTable } from '@theorchard/suite-components';
import { isEmpty } from 'lodash-es';
import { TAX_WITHOLDING_COUNTRY } from 'src/constants';
import { getCountryName } from 'src/utils/country';
import type { GridTableColumnDefinition } from '@theorchard/suite-components';
import type { GetAbacusReferenceTaxWithholdingQuery } from 'src/apollo/queries/__generated__/reference-tax-withholding';
import type { AbacusReferenceTaxWithholding } from 'src/types/reference';

type AbacusReferenceTaxWithHoldingItem = NonNullable<
    GetAbacusReferenceTaxWithholdingQuery['abacusReferenceTaxWithholding']['items']
>[0];

export interface TaxWithholdingPropType {
    rateList: (AbacusReferenceTaxWithHoldingItem | null)[] | null;
    isLoading: boolean;
    filterBy?: string;
}

const UK_COLUMNS_DEFS: GridTableColumnDefinition[] = [
    {
        name: 'countryName',
        title: 'Country Of Residence',
    },
    {
        name: 'taxRate',
        title: 'Tax Withholding Rate',
        template: { align: 'right' },
    },
];

const US_COLUMNS_DEFS: GridTableColumnDefinition[] = [
    {
        name: 'countryName',
        title: 'Country Of Residence',
    },
    {
        name: 'isResourceProvisioned',
        title: 'Resource Provision',
    },
    {
        name: 'taxRate',
        title: 'Tax Withholding Rate',
        template: { align: 'right' },
    },
];

export const TaxWithholding: React.FC<TaxWithholdingPropType> = ({
    rateList,
    filterBy,
}) => {
    const formatTaxRate = (taxRate: string | null) => {
        if (taxRate !== null) return `${parseFloat(taxRate)}%`;
        return 'N/A';
    };

    const renderHeaderPreffix = () => {
        switch (filterBy) {
            case TAX_WITHOLDING_COUNTRY.UK:
                return 'UK';
            case TAX_WITHOLDING_COUNTRY.US:
                return 'US';
            default:
                return '';
        }
    };

    const columnDefinitions = () => {
        switch (filterBy) {
            case TAX_WITHOLDING_COUNTRY.UK:
                return UK_COLUMNS_DEFS;
            case TAX_WITHOLDING_COUNTRY.US:
                return US_COLUMNS_DEFS;
            default:
                return [];
        }
    };

    const formatTaxWithholding = () => {
        if (!isEmpty(rateList)) {
            const taxRateList = rateList?.filter(
                (rate: AbacusReferenceTaxWithHoldingItem | null) =>
                    rate && rate.countryOfWithholding === filterBy
            );
            const rateListSorted: AbacusReferenceTaxWithholding[] = [];
            taxRateList?.forEach(
                (item: AbacusReferenceTaxWithHoldingItem | null) => {
                    const rate = {} as AbacusReferenceTaxWithholding;
                    if (item) {
                        rate.id = item.referenceTaxWithholdingId;
                        rate.countryName =
                            getCountryName(item.countryOfTaxResidence) ||
                            'Other';
                        rate.taxRate = formatTaxRate(item.taxRate);
                        rate.isResourceProvisioned = item.isResourceProvisioned
                            ? 'Yes'
                            : 'No';

                        rateListSorted[parseInt(rate.id)] = rate;
                    }
                }
            );

            rateListSorted.sort(
                (
                    a: AbacusReferenceTaxWithholding,
                    b: AbacusReferenceTaxWithholding
                ) => a.countryName.localeCompare(b.countryName)
            );

            return rateListSorted.map((rate: AbacusReferenceTaxWithholding) => {
                const { countryName, taxRate, isResourceProvisioned } = rate;

                return { countryName, isResourceProvisioned, taxRate };
            });
        }
        return [];
    };

    const tableData = formatTaxWithholding();
    const tableDataFiltered = tableData.filter(
        tableDataElement => tableDataElement != null
    );

    return (
        <>
            <h2>{renderHeaderPreffix()} Tax Withholding Rates</h2>
            <GridTable
                bordered
                data={tableDataFiltered}
                columnDefs={columnDefinitions()}
                hideEmptyState
            />
        </>
    );
};

export default TaxWithholding;
