import { router } from '@inertiajs/react';
import { RotateCcw } from 'lucide-react';
import { useState } from 'react';
import { Button } from '@/components/ui/button';
import { ReviewActionDialog } from '@/features/documents/components/review-action-dialog';
import { canUseReviewAction } from '@/features/documents/lib/review-permissions';
import {
    getAllowedAccountantReviewActions,
    getAllowedReviewActions,
    reviewActionReasonRequired,
} from '@/features/documents/lib/review-workflow';
import type { DocumentReviewAction } from '@/features/documents/lib/review-workflow';
import { useDocumentReviewTranslations } from '@/features/documents/lib/use-document-review-translations';
import type { DocumentDetail } from '@/features/documents/types';
import { useAuthorization } from '@/hooks/use-authorization';
import { useI18n } from '@/hooks/use-i18n';

type DocumentReviewActionsProps = {
    document: DocumentDetail;
};

export function DocumentReviewActions({ document }: DocumentReviewActionsProps) {
    const { t } = useI18n();
    const { labels, dialogPresets } = useDocumentReviewTranslations();
    const { can, hasRole } = useAuthorization();
    const [selectedAction, setSelectedAction] = useState<DocumentReviewAction | null>(null);
    const [isReprocessing, setIsReprocessing] = useState(false);

    const internalReviewer = hasRole('admin') || hasRole('accountant');

    if (!internalReviewer) {
        return null;
    }

    const accountantActions = getAllowedAccountantReviewActions(document.ai_status, document.accountant_status).filter(
        (action) => canUseReviewAction(action, can, hasRole),
    );

    const canReprocess =
        getAllowedReviewActions(document.ai_status, document.accountant_status).includes('reprocess') &&
        canUseReviewAction('reprocess', can, hasRole);

    if (accountantActions.length === 0 && !canReprocess) {
        return null;
    }

    const openActionDialog = (action: DocumentReviewAction) => {
        if (action === 'mark_in_review') {
            router.post(
                `/admin/documents/${document.id}/review`,
                { action },
                {
                    preserveScroll: true,
                    preserveState: true,
                },
            );

            return;
        }

        setSelectedAction(action);
    };

    const runReprocess = () => {
        router.post(
            `/admin/documents/${document.id}/review`,
            { action: 'reprocess' },
            {
                preserveScroll: true,
                preserveState: true,
                onStart: () => setIsReprocessing(true),
                onFinish: () => setIsReprocessing(false),
            },
        );
    };

    const dialogConfig = selectedAction ? dialogPresets[selectedAction] : null;

    return (
        <div className="space-y-6">
            {accountantActions.length > 0 ? (
                <div className="space-y-2">
                    <p className="text-xs font-medium uppercase tracking-wide text-muted-foreground">
                        {t('documents.admin_show.review.section_accountant')}
                    </p>
                    <p className="text-xs text-muted-foreground">
                        {t('documents.admin_show.review.section_accountant_hint')}
                    </p>
                    <div className="flex flex-wrap items-center justify-start gap-2">
                        {accountantActions.map((action) => {
                            const isDestructive = dialogPresets[action].variant === 'destructive';

                            return (
                                <Button
                                    key={action}
                                    type="button"
                                    size="sm"
                                    variant={isDestructive ? 'destructive' : 'outline'}
                                    onClick={() => openActionDialog(action)}
                                >
                                    {labels[action]}
                                </Button>
                            );
                        })}
                    </div>
                </div>
            ) : null}

            {canReprocess ? (
                <div className="space-y-2 border-t border-border/60 pt-4">
                    <p className="text-xs font-medium uppercase tracking-wide text-muted-foreground">
                        {t('documents.admin_show.review.section_ai')}
                    </p>
                    <p className="text-xs text-muted-foreground">{t('documents.admin_show.review.section_ai_hint')}</p>
                    <Button
                        type="button"
                        size="sm"
                        variant="secondary"
                        onClick={runReprocess}
                        disabled={isReprocessing}
                        className="gap-1.5"
                    >
                        <RotateCcw className="h-3.5 w-3.5" />
                        {labels.reprocess}
                    </Button>
                </div>
            ) : null}

            <ReviewActionDialog
                documentId={document.id}
                action={selectedAction}
                open={Boolean(selectedAction && dialogConfig)}
                title={dialogConfig?.title ?? ''}
                description={dialogConfig?.description ?? ''}
                reasonLabel={dialogConfig?.reasonLabel ?? ''}
                reasonPlaceholder={dialogConfig?.reasonPlaceholder ?? ''}
                reasonRequired={selectedAction ? reviewActionReasonRequired[selectedAction] : false}
                onOpenChange={(open) => {
                    if (!open) {
                        setSelectedAction(null);
                    }
                }}
            />
        </div>
    );
}
