'use client';

import { ListingActionsColumnCell, listingServerSortNoOp } from '@/components/listings';
import type { ServerSideSortColumnUi } from '@/hooks/useServerSideListingTableChange';
import { Tag } from 'antd';
import React from 'react';
import type { ColumnsType } from 'antd/es/table';
import { formatDate } from '@/lib/utils/export';
import {
    getEntregaPrioridadeColor,
    getEntregaPrioridadeLabel,
    getEntregaStatusColor,
    getEntregaStatusLabel,
    getEntregaTipoLabel,
} from '@/features/projetos/planejamento/entregas/entregasPlanejamentoOptions';
import type { EntregaGlobalRow } from './types';

export type HandlersEntregasGlobal = {
    setOpcoesItem: (e: EntregaGlobalRow | null) => void;
    sortColumnUi: ServerSideSortColumnUi;
};

export function getColumnsEntregasGlobal(
    handlers: HandlersEntregasGlobal,
): ColumnsType<EntregaGlobalRow> {
    const { setOpcoesItem, sortColumnUi } = handlers;
    return [
        {
            title: 'Código',
            dataIndex: 'codigo',
            key: 'codigo',
            width: 120,
            responsive: ['md'],
            sorter: listingServerSortNoOp,
            sortOrder: sortColumnUi.columnKey === 'codigo' ? sortColumnUi.order : undefined,
            render: (codigo: string) => codigo || '-',
        },
        {
            title: 'Título',
            dataIndex: 'titulo',
            key: 'titulo',
            sorter: listingServerSortNoOp,
            sortOrder: sortColumnUi.columnKey === 'titulo' ? sortColumnUi.order : undefined,
            render: (titulo: string) => (
                <span style={{ fontWeight: 600, color: 'var(--text-primary, inherit)' }}>{titulo}</span>
            ),
        },
        {
            title: 'Status',
            dataIndex: 'status',
            key: 'status',
            sorter: listingServerSortNoOp,
            sortOrder: sortColumnUi.columnKey === 'status' ? sortColumnUi.order : undefined,
            render: (status: string) => (
                <Tag color={getEntregaStatusColor(status)}>{getEntregaStatusLabel(status)}</Tag>
            ),
        },
        {
            title: 'Tipo',
            dataIndex: 'tipo',
            key: 'tipo',
            responsive: ['sm'],
            sorter: listingServerSortNoOp,
            sortOrder: sortColumnUi.columnKey === 'tipo' ? sortColumnUi.order : undefined,
            render: (tipo: string) => getEntregaTipoLabel(tipo),
        },
        {
            title: 'Prioridade',
            dataIndex: 'prioridade',
            key: 'prioridade',
            responsive: ['lg'],
            sorter: listingServerSortNoOp,
            sortOrder: sortColumnUi.columnKey === 'prioridade' ? sortColumnUi.order : undefined,
            render: (prioridade: string) =>
                prioridade ? (
                    <Tag color={getEntregaPrioridadeColor(prioridade)}>
                        {getEntregaPrioridadeLabel(prioridade)}
                    </Tag>
                ) : (
                    '-'
                ),
        },
        {
            title: 'Projeto',
            key: 'projeto',
            responsive: ['md'],
            render: (_: unknown, record: EntregaGlobalRow) => record.projeto?.nome ?? '-',
        },
        {
            title: 'Responsável',
            key: 'responsavel',
            responsive: ['xl'],
            sorter: listingServerSortNoOp,
            sortOrder: sortColumnUi.columnKey === 'responsavel' ? sortColumnUi.order : undefined,
            render: (_: unknown, record: EntregaGlobalRow) => record.responsavel?.nome ?? '-',
        },
        {
            title: 'Data planejada',
            dataIndex: 'data_planejada',
            key: 'data_planejada',
            responsive: ['lg'],
            sorter: listingServerSortNoOp,
            sortOrder: sortColumnUi.columnKey === 'data_planejada' ? sortColumnUi.order : undefined,
            render: (d: string) => (d ? formatDate(d) : '-'),
        },
        {
            title: '',
            key: 'menu',
            width: 56,
            align: 'center',
            fixed: 'right',
            onCell: () => ({ onClick: (e: React.MouseEvent) => e.stopPropagation() }),
            render: (_: unknown, record: EntregaGlobalRow) => (
                <ListingActionsColumnCell
                    ariaLabel={`Opções: ${record.titulo || record.codigo || record.id}`}
                    onOpen={() => setOpcoesItem(record)}
                    data-testid={`projetos-entregas-global-opcoes-${record.id}`}
                />
            ),
        },
    ];
}
