'use client';

/**
 * Estados loading / vazio / erro padronizados do release train (Alfred parque FE).
 */

import { Plus, Rocket } from 'lucide-react';
import React from 'react';
import { Button, Empty, Skeleton, Space } from 'antd';
import { ProdutoSoftwareTipoFetchErrorAlert } from '@/features/projetos/components/ProdutoSoftwareTipoFetchErrorAlert';

type LoadingProps = {
    rows?: number;
};

export function ProdutoReleaseListSkeleton({ rows = 4 }: LoadingProps) {
    return (
        <Space direction="vertical" size={12} style={{ width: '100%' }} data-testid="releases-list-skeleton">
            {Array.from({ length: rows }).map((_, i) => (
                <Skeleton
                    key={i}
                    active
                    title={{ width: '40%' }}
                    paragraph={{ rows: 2, width: ['90%', '55%'] }}
                />
            ))}
        </Space>
    );
}

type EmptyProps = {
    canEditar: boolean;
    onNovaRelease?: () => void;
};

export function ProdutoReleaseListEmpty({ canEditar, onNovaRelease }: EmptyProps) {
    return (
        <Empty
            image={<Rocket size={40} aria-hidden style={{ opacity: 0.45 }} />}
            description="Nenhuma release — crie a primeira para coordenar as superfícies do programa."
            data-testid="releases-list-empty"
        >
            {canEditar && onNovaRelease ? (
                <Button
                    type="primary"
                    icon={<Plus size={16} aria-hidden />}
                    onClick={onNovaRelease}
                    data-testid="releases-list-empty-cta"
                >
                    Nova release
                </Button>
            ) : null}
        </Empty>
    );
}

type ErrorProps = {
    error: unknown;
    onRetry: () => void;
};

export function ProdutoReleaseListError({ error, onRetry }: ErrorProps) {
    return (
        <ProdutoSoftwareTipoFetchErrorAlert
            error={error}
            fallbackMessage="Não foi possível carregar as releases"
            onRetry={onRetry}
        />
    );
}
