import React, { useContext } from 'react';
import { get } from 'lodash-es';
import { ContractTermContext } from 'src/contexts/contract-term-context';
import { getCountryName } from 'src/utils/country';
import type { GetContractQuery } from 'src/apollo/queries/contract/__generated__/get-contract';

type AbacusContract = NonNullable<GetContractQuery['abacusContract']>;
type ContractTerms =
    NonNullable<AbacusContract['contractTerms']> extends (infer T)[] ? T : null;
type ContractTermConditions =
    NonNullable<ContractTerms['conditions']> extends (infer T)[] ? T : null;

export interface NrContractTermConditionPropType {
    contractTermCondition: ContractTermConditions;
}

export const NrContractTermCondition: React.FC<
    NrContractTermConditionPropType
> = ({ contractTermCondition }) => {
    const { state } = useContext(ContractTermContext);
    const storeList: string[] = state.stores;
    const transactionTypeList = state.transactionTypes;
    const conditionName = contractTermCondition.contractTermConditionName;
    const commission = contractTermCondition.commission;
    const countriesCodes = get(
        contractTermCondition,
        'conditions.countries',
        []
    );
    const storesIds: string[] = get(
        contractTermCondition,
        'conditions.stores',
        []
    );
    const transactionTypesIds = get(
        contractTermCondition,
        'conditions.transactionTypes',
        []
    );
    let stores: string;
    let transactionTypes: string;
    let countries: string;
    if (!storesIds || !storesIds.length) stores = 'All';
    else
        stores = storesIds.map((storeId: any) => storeList[storeId]).join(', ');

    if (!transactionTypesIds || !transactionTypesIds.length)
        transactionTypes = 'All';
    else
        transactionTypes = transactionTypesIds
            .map(
                (transactionTypeId: any) =>
                    transactionTypeList[transactionTypeId] &&
                    transactionTypeList[transactionTypeId].txnTypeCode.concat(
                        ' - ',
                        transactionTypeList[transactionTypeId].txnTypeName
                    )
            )
            .join(', ');

    if (countriesCodes && countriesCodes.length)
        countries = countriesCodes
            .map((code: any) => getCountryName(code))
            .join(', ');
    else countries = 'All';

    return (
        <>
            <td>{conditionName}</td>
            <td>{transactionTypes}</td>
            <td>{stores}</td>
            <td>{countries}</td>
            <td>{commission} %</td>
        </>
    );
};

export default NrContractTermCondition;
