import { Pause, Play, Square } from 'lucide-react';
import { ICON_SIZE_MD } from '@/components/icons';
import React from 'react';
import { Space, Tag, Button, Badge, Typography } from 'antd';
import type { ColumnsType } from 'antd/es/table';
import type { TarefaFilaCursor } from './types';
import {
    formatStatusExecucaoCursorLabel,
    resolveStatusExecucaoCursor,
    type StatusExecucaoCursor,
} from './filaCursorStatus';

export function getFilaCursorBadgeStatus(
    status: StatusExecucaoCursor,
): 'success' | 'processing' | 'default' | 'error' | 'warning' {
    const map: Record<
        StatusExecucaoCursor,
        'success' | 'processing' | 'default' | 'error' | 'warning'
    > = {
        pendente: 'default',
        em_execucao: 'processing',
        pausada: 'warning',
        concluida: 'success',
        erro: 'error',
        cancelada: 'default',
    };
    return map[status] ?? 'default';
}

export function getFilaCursorPrioridadeColor(prioridade: string): string {
    const colors: Record<string, string> = {
        baixa: 'default',
        media: 'blue',
        alta: 'orange',
        critica: 'red',
    };
    return colors[prioridade] || 'default';
}

export type FilaCursorAcao = 'iniciar' | 'pausar' | 'cancelar' | 'retomar';

export function buildFilaCursorColumns(options: {
    onAcao: (tarefa: TarefaFilaCursor, acao: FilaCursorAcao) => void;
    onVerDetalhes: (tarefaId: number) => void;
    acaoPendingTarefaId?: number | null;
}): ColumnsType<TarefaFilaCursor> {
    const { onAcao, onVerDetalhes, acaoPendingTarefaId = null } = options;
    const isAcaoLoading = (recordId: number) =>
        acaoPendingTarefaId != null && acaoPendingTarefaId === recordId;

    return [
        {
            title: 'Título',
            dataIndex: 'titulo',
            key: 'titulo',
            sorter: (a, b) => String(a.titulo ?? '').localeCompare(String(b.titulo ?? ''), 'pt'),
            render: (text: string, record: TarefaFilaCursor) => (
                <Space direction="vertical">
                    <Typography.Text strong>{text}</Typography.Text>
                    {record.descricao && (
                        <Typography.Text type="secondary" style={{ fontSize: '12px' }}>
                            {record.descricao.length > 80
                                ? `${record.descricao.substring(0, 80)}...`
                                : record.descricao}
                        </Typography.Text>
                    )}
                </Space>
            ),
        },
        {
            title: 'Status execução',
            key: 'status_execucao_cursor',
            sorter: (a, b) =>
                resolveStatusExecucaoCursor(a).localeCompare(resolveStatusExecucaoCursor(b), 'pt'),
            render: (_: unknown, record: TarefaFilaCursor) => {
                const status = resolveStatusExecucaoCursor(record);
                return (
                    <Badge
                        status={getFilaCursorBadgeStatus(status)}
                        text={formatStatusExecucaoCursorLabel(status)}
                    />
                );
            },
        },
        {
            title: 'Prioridade',
            dataIndex: 'prioridade',
            key: 'prioridade',
            sorter: (a, b) =>
                String(a.prioridade ?? '').localeCompare(String(b.prioridade ?? ''), 'pt'),
            render: (prioridade: string) => (
                <Tag color={getFilaCursorPrioridadeColor(prioridade)}>{prioridade.toUpperCase()}</Tag>
            ),
        },
        {
            title: 'Projeto',
            key: 'projeto',
            sorter: (a, b) =>
                String(a.projeto?.nome ?? '').localeCompare(String(b.projeto?.nome ?? ''), 'pt'),
            render: (_: unknown, record: TarefaFilaCursor) => record.projeto?.nome || '-',
        },
        {
            title: 'Progresso',
            key: 'progresso',
            sorter: (a, b) => (a.progresso ?? -1) - (b.progresso ?? -1),
            render: (_: unknown, record: TarefaFilaCursor) =>
                record.progresso !== undefined ? (
                    <div>
                        <div style={{ marginBottom: '4px' }}>{record.progresso}%</div>
                        <div
                            style={{
                                width: '100px',
                                height: '8px',
                                background: '#f0f0f0',
                                borderRadius: '4px',
                                overflow: 'hidden',
                            }}
                        >
                            <div
                                style={{
                                    width: `${record.progresso}%`,
                                    height: '100%',
                                    background: record.progresso === 100 ? '#52c41a' : '#1890ff',
                                    transition: 'width 0.3s',
                                }}
                            />
                        </div>
                    </div>
                ) : (
                    '-'
                ),
        },
        {
            title: 'Ações',
            key: 'acoes',
            render: (_: unknown, record: TarefaFilaCursor) => {
                const status = resolveStatusExecucaoCursor(record);
                const loading = isAcaoLoading(record.id);

                return (
                    <Space wrap>
                        {status === 'pendente' && (
                            <Button
                                icon={<Play size={ICON_SIZE_MD} aria-hidden />}
                                loading={loading}
                                disabled={loading}
                                onClick={() => onAcao(record, 'iniciar')}
                            >
                                Iniciar
                            </Button>
                        )}
                        {status === 'em_execucao' && (
                            <>
                                <Button
                                    icon={<Pause size={ICON_SIZE_MD} aria-hidden />}
                                    loading={loading}
                                    disabled={loading}
                                    onClick={() => onAcao(record, 'pausar')}
                                >
                                    Pausar
                                </Button>
                                <Button
                                    danger
                                    icon={<Square size={ICON_SIZE_MD} aria-hidden />}
                                    loading={loading}
                                    disabled={loading}
                                    onClick={() => onAcao(record, 'cancelar')}
                                >
                                    Cancelar
                                </Button>
                            </>
                        )}
                        {status === 'pausada' && (
                            <Button
                                icon={<Play size={ICON_SIZE_MD} aria-hidden />}
                                loading={loading}
                                disabled={loading}
                                onClick={() => onAcao(record, 'retomar')}
                            >
                                Retomar
                            </Button>
                        )}
                        <Button onClick={() => onVerDetalhes(record.id)}>Ver detalhes</Button>
                    </Space>
                );
            },
        },
    ];
}
