'use client';

/**
 * FRONT-S4-03 — Três estados (loading / empty / error) para dados de query.
 * @see front/docs/sprint-sprint-sprint-front-s4-03-query-states.md
 */

import React, { ReactNode } from 'react';
import { Button, Result, Space } from 'antd';
import { EmptyState } from '@/components/empty';
import { ForbiddenNextActionCta } from '@/components/feedback/ForbiddenNextActionCta';
import { getLaravelApiErrorMessage, getLaravelApiNextAction } from '@/lib/api/laravelApiErrorMessage';
import { LoadingState } from '@/components/ui/LoadingState';

export interface QueryDataStatesProps {
    isLoading: boolean;
    isError: boolean;
    error?: unknown;
    onRetry: () => void;
    isEmpty: boolean;
    emptyTitle?: string;
    emptyDescription?: ReactNode;
    emptyAction?: ReactNode;
    emptyIcon?: ReactNode;
    loadingTip?: string;
    errorTitle?: string;
    children: ReactNode;
}

function errorMessageFromUnknown(error: unknown): string {
    return getLaravelApiErrorMessage(error, 'Não foi possível carregar os dados. Tente novamente.');
}

export function QueryDataStates({
    isLoading,
    isError,
    error,
    onRetry,
    isEmpty,
    emptyTitle = 'Nenhum registro encontrado',
    emptyDescription,
    emptyAction,
    emptyIcon,
    loadingTip = 'Carregando…',
    errorTitle = 'Algo correu mal',
    children,
}: QueryDataStatesProps) {
    if (isLoading) {
        return (
            <div style={{ textAlign: 'center', padding: '48px 24px' }}>
                <LoadingState size="large" label={loadingTip} />
            </div>
        );
    }

    if (isError) {
        const hasNextAction = Boolean(getLaravelApiNextAction(error));
        return (
            <Result
                status="error"
                title={errorTitle}
                subTitle={errorMessageFromUnknown(error)}
                extra={
                    <Space wrap>
                        <ForbiddenNextActionCta error={error} />
                        <Button type={hasNextAction ? 'default' : 'primary'} onClick={() => onRetry()}>
                            Tentar novamente
                        </Button>
                    </Space>
                }
            />
        );
    }

    if (isEmpty) {
        return (
            <EmptyState
                icon={emptyIcon}
                title={emptyTitle}
                description={emptyDescription}
                action={emptyAction}
            />
        );
    }

    return <>{children}</>;
}
