import type { FC } from 'react';
import React from 'react';
import {
    GridTable,
    type GridTableCellProps,
    TruncatedText,
} from '@theorchard/suite-components';
import { createHref } from '@theorchard/suite-frontend';
import { Link } from 'react-router-dom';
import { ROUTE_CATALOG_TRACK_RULES } from 'src/constants';
import type { AllFingerprintRules } from 'src/types';

interface Props {
    page: number;
    setPage: (page: number) => void;
    pageSize: number;
    setPageSize: (page: number) => void;
    loading: boolean;
    data?: AllFingerprintRules;
}

export const CLASS_NAME = 'FingerprintRestrictionsTable';

const TrackNameCell = ({
    data: { track, trackId, productId },
}: GridTableCellProps<{
    track: string;
    trackId: string;
    productId: number;
}>) => {
    return (
        <div className={`${CLASS_NAME}-table-primary-row-link`}>
            <div>
                <Link
                    to={createHref(ROUTE_CATALOG_TRACK_RULES, {
                        productId,
                        trackId,
                    })}
                    target="_blank"
                    rel="noopener noreferrer"
                >
                    <TruncatedText text={track} maxWidth={270} />
                </Link>
            </div>
        </div>
    );
};

const FingerprintRestrictionsTable: FC<Props> = ({
    page,
    setPage,
    pageSize,
    setPageSize,
    loading,
    data,
}) => {
    const formattedData = data?.tracks.map(track => ({
        number: track.trackNumber,
        track: track.trackName,
        trackId: track.tuid,
        productId: data?.productId,
        isrc: track.isrc,
        accountRules: data?.vendorRules.length,
        subAccountRules: data?.subaccountRules.length,
        trackRules: track.rules.length,
    }));

    return (
        <GridTable
            className={CLASS_NAME}
            testId={`${CLASS_NAME}`}
            name="fingerprint-restrictions"
            variant="zebra"
            data={formattedData}
            rowKey="id"
            paginated
            loading={loading}
            loadingRows={pageSize}
            totalCount={data?.numberOfTracks}
            page={page}
            pageSize={pageSize}
            onPageChange={setPage}
            onPageSizeChange={setPageSize}
            showUpdateIndicator
        >
            <GridTable.Column
                className={`${CLASS_NAME}-cell-number`}
                title="#"
                name="number"
                maxWidth={'50px'}
            />
            <GridTable.Column
                className={`${CLASS_NAME}-cell-track`}
                title={$t(
                    'contentReview.productModal.fingerprintRulesTable.trackColumnTitle'
                )}
                Cell={TrackNameCell}
            />
            <GridTable.Column
                className={`${CLASS_NAME}-cell-isrc`}
                title="ISRC"
                name="isrc"
                align={'right'}
                maxWidth={'200px'}
            />
            <GridTable.Column
                className={`${CLASS_NAME}-cell-account-rules`}
                title={$t(
                    'contentReview.fingerprintRestrictions.table.titles.accountRules'
                )}
                name="accountRules"
                maxWidth={'200px'}
                align={'right'}
            />
            <GridTable.Column
                className={`${CLASS_NAME}-cell-sub-account-rules`}
                title={$t(
                    'contentReview.fingerprintRestrictions.table.titles.subAccountRules'
                )}
                name="subAccountRules"
                maxWidth={'200px'}
                align={'right'}
            />
            <GridTable.Column
                className={`${CLASS_NAME}-cell-track-rules`}
                title={$t(
                    'contentReview.fingerprintRestrictions.table.titles.trackRules'
                )}
                name="trackRules"
                maxWidth={'200px'}
                align={'right'}
            />
        </GridTable>
    );
};

export default FingerprintRestrictionsTable;
