'use client';

import React from 'react';
import { Skeleton } from 'antd';
import type { ColumnsType } from 'antd/es/table';

/** Marca de linha placeholder para listagens (ordenar / filtrar / carga inicial). */
export type ListingSkeletonRow = { id: string; listingSkeletonRow: true };

export function isListingSkeletonRow(record: unknown): record is ListingSkeletonRow {
    return (
        typeof record === 'object' &&
        record !== null &&
        'listingSkeletonRow' in record &&
        (record as ListingSkeletonRow).listingSkeletonRow === true
    );
}

export function buildListingSkeletonRows(count: number): ListingSkeletonRow[] {
    const n = Math.max(0, Math.min(count, 40));
    return Array.from({ length: n }, (_, i) => ({
        id: `__listing_sk_${i}`,
        listingSkeletonRow: true,
    }));
}

/** Número de linhas skeleton: entre min e max, baseado na página atual ou valor por omissão. */
export function listingSkeletonRowCount(
    currentRowCount: number,
    pageSize: number,
    min = 5,
    max = 20
): number {
    const base = currentRowCount > 0 ? currentRowCount : pageSize;
    return Math.min(Math.max(base, min), max);
}

/**
 * Envolve colunas para renderizar {@link Skeleton.Input} em linhas marcadas como skeleton.
 */
export function wrapColumnsWithListingSkeleton<T extends Record<string, unknown>>(
    columns: ColumnsType<T>
): ColumnsType<T | ListingSkeletonRow> {
    return columns.map((col) => {
        const originalRender = col.render;
        return {
            ...col,
            render: (value: unknown, record: T | ListingSkeletonRow, index: number) => {
                if (isListingSkeletonRow(record)) {
                    return (
                        <Skeleton.Input
                            active
                            size="small"
                            style={{ width: '100%', maxWidth: 280, minWidth: 48 }}
                        />
                    );
                }
                return originalRender
                    ? originalRender(value, record as T, index)
                    : (value as React.ReactNode);
            },
        };
    }) as ColumnsType<T | ListingSkeletonRow>;
}
