'use client';

/**
 * Empty state tipológico canónico — orientação + CTAs sync/sugestões (+ ação local opcional).
 * Sync L2 C2: quando o domínio enfatiza handbook, mostra Alert com diff N pendentes.
 */

import React, { type ReactNode } from 'react';
import { Alert, Space } from 'antd';
import { EmptyState } from '@/components/empty';
import { ProjetoTipologicoSyncCtas } from './ProjetoTipologicoSyncCtas';
import {
    tipologicoEmptyDescription,
    tipologicoEmptyDescriptionForDomain,
    tipologicoHandbookPendentesAlertMessage,
    TIPOLOGICO_APPLY_FROM_SYNC_DOMAINS,
    TIPOLOGICO_DOMAIN_SYNC_SCOPE,
    type TipologicoEmptyDomainKey,
    type TipologicoSyncScope,
} from './tipologicoEmptyCopy';
import { useCursorSugestoesPendentesCount } from './useCursorSugestoesPendentesCount';

export type ProjetoTipologicoEmptyStateProps = {
    projetoId: string;
    title: string;
    /** Frase de domínio (sem o hint de sync — concatenado automaticamente). */
    domainDescription?: string;
    /** Chave canónica — aplica copy + escopo de sync do contrato inventário 1.4. */
    domainKey?: TipologicoEmptyDomainKey;
    /** Override do escopo (default: derivado de domainKey ou lww_md). */
    syncScope?: TipologicoSyncScope;
    icon?: ReactNode;
    /** CTA local (ex.: «Cadastrar», «Preencher agora»). */
    primaryAction?: ReactNode;
    /** Exibe CTAs sync/sugestões (default true; em manual_only permanece true com hint correto). */
    showSyncCtas?: boolean;
    className?: string;
    'data-testid'?: string;
};

export function ProjetoTipologicoEmptyState({
    projetoId,
    title,
    domainDescription,
    domainKey,
    syncScope: syncScopeProp,
    icon,
    primaryAction,
    showSyncCtas = true,
    className,
    'data-testid': dataTestId = 'projeto-tipologico-empty',
}: ProjetoTipologicoEmptyStateProps) {
    const syncScope: TipologicoSyncScope =
        syncScopeProp ??
        (domainKey ? TIPOLOGICO_DOMAIN_SYNC_SCOPE[domainKey] : 'lww_md');

    const description = domainKey
        ? tipologicoEmptyDescriptionForDomain(domainKey)
        : tipologicoEmptyDescription(domainDescription ?? '', syncScope);

    const emphasizeApplyFromSync =
        domainKey != null && TIPOLOGICO_APPLY_FROM_SYNC_DOMAINS.has(domainKey);

    const { pendentesCount } = useCursorSugestoesPendentesCount(
        projetoId,
        emphasizeApplyFromSync && showSyncCtas,
    );

    const showPendentesAlert =
        emphasizeApplyFromSync && pendentesCount != null && pendentesCount > 0;

    return (
        <EmptyState
            className={className}
            icon={icon}
            title={title}
            description={showSyncCtas ? description : (domainDescription ?? description)}
            action={
                <Space
                    direction="vertical"
                    size={12}
                    align="center"
                    style={{ width: '100%' }}
                    data-testid={dataTestId}
                >
                    {showPendentesAlert ? (
                        <Alert
                            type="info"
                            showIcon
                            message={tipologicoHandbookPendentesAlertMessage(pendentesCount)}
                            style={{ width: '100%', maxWidth: 520, textAlign: 'left' }}
                            data-testid={`${dataTestId}-handbook-pendentes`}
                        />
                    ) : null}
                    {primaryAction ? <div>{primaryAction}</div> : null}
                    {showSyncCtas ? (
                        <ProjetoTipologicoSyncCtas
                            projetoId={projetoId}
                            emphasizeApplyFromSync={emphasizeApplyFromSync}
                            emphasizeSync={!primaryAction && !emphasizeApplyFromSync}
                            pendentesCount={emphasizeApplyFromSync ? pendentesCount : undefined}
                            data-testid={`${dataTestId}-ctas`}
                        />
                    ) : null}
                </Space>
            }
        />
    );
}
