import $i18n from '../../../../../../../locales/i18n.js';
import React, { useState, useRef, useEffect, useCallback } from 'react';
import { CnButton, CnIcon, CnInput } from '@cainiaofe/cn-ui';
import { useModel } from '../../../../../../../utils/mobx-react-simpler/index.js';
import { PromptEditor } from '../prompt-editor';
import { DEFAULT_MODEL, getDefaultPromptByFieldType } from '../constants';
import { getAiTaskType, getFieldIcon, generateColumnCode } from '../utils';
import { parsePromptVariables, hasPromptVariables, enrichPromptWithFieldNames, buildPromptParamsWithExtractor, } from '../utils/prompt-utils';
import { submitAiColumnPreview, queryAiColumnPreview, } from '../../../../../../../cn-ai-table/view/services/ai-column-service';
import { AGENT_ID } from '../../../../../hooks/constants';
import './ai-field-config-panel.scss';
import { ConfirmDialog } from './confirm-dialog';
import { PreviewContent } from './preview-content';
/** 预览轮询间隔（毫秒） */
const PREVIEW_POLLING_INTERVAL = 1500;
/** 预览最大轮询次数 */
const PREVIEW_MAX_POLLING_COUNT = 40;
export function AiFieldConfigPanel({ fieldType, fieldLabel, columnCode: existingColumnCode, saving = false, executing = false, initialPromptTemplate, isEditStatus, onSave, onCancel, }) {
    var _a;
    // 获取数据模型
    const dataModel = useModel('dataModel');
    // 状态管理
    const [fieldName, setFieldName] = useState(fieldLabel);
    const [promptValue, setPromptValue] = useState(initialPromptTemplate || getDefaultPromptByFieldType(fieldType));
    const [model, setModel] = useState(DEFAULT_MODEL);
    const [autoUpdate, setAutoUpdate] = useState(false);
    const [confirmDialogVisible, setConfirmDialogVisible] = useState(false);
    const [validationError, setValidationError] = useState('');
    // 预览状态
    const [previewLoading, setPreviewLoading] = useState(false);
    const [previewResult, setPreviewResult] = useState('');
    const [previewError, setPreviewError] = useState('');
    const [previewInterrupted, setPreviewInterrupted] = useState(false);
    // 是否从未预览过（编辑模式初始为 true，用于显示"点击生成预览"按钮）
    const [neverPreviewed, setNeverPreviewed] = useState(!!existingColumnCode);
    const previewPollingRef = useRef(null);
    // 记录上一次的变量数量，用于检测首次插入字段
    const prevVariableCountRef = useRef(0);
    // 记录是否已完成初始化（编辑模式下，初始化时已有字段，不触发预览）
    const isInitializedRef = useRef(false);
    // 防抖定时器，用于修改内容后自动触发预览
    const autoPreviewTimerRef = useRef(null);
    // Refs
    const promptEditorRef = useRef(null);
    const fieldNameInputRef = useRef(null);
    // 获取可插入的字段列表
    const getAvailableFields = useCallback(() => {
        const columnDefinitions = (dataModel === null || dataModel === void 0 ? void 0 : dataModel.columnDefinitions) || [];
        const fieldMap = (dataModel === null || dataModel === void 0 ? void 0 : dataModel.fieldMap) || {};
        return columnDefinitions
            .filter((col) => !col.isAiColumn)
            .map((col) => {
            const fieldInfo = fieldMap[col.dataIndex];
            return {
                dataIndex: col.dataIndex,
                title: col.title || col.dataIndex,
                icon: getFieldIcon(fieldInfo === null || fieldInfo === void 0 ? void 0 : fieldInfo.component),
                group: (fieldInfo === null || fieldInfo === void 0 ? void 0 : fieldInfo.group) || $i18n.get({ id: 'Field', dm: '字段' }),
            };
        });
    }, [dataModel]);
    // 获取补充后的 prompt（用于接口请求）
    const getEnrichedPrompt = useCallback((prompt) => {
        const fields = getAvailableFields();
        return enrichPromptWithFieldNames(prompt, fields);
    }, [getAvailableFields]);
    // 验证表单
    const validateForm = () => {
        if (!hasPromptVariables(promptValue)) {
            setValidationError($i18n.get({
                id: 'PleaseInsertAFieldInTheTaskDescr_1740586859',
                dm: '请在任务描述中插入字段',
            }));
            return false;
        }
        setValidationError('');
        return true;
    };
    // 当 fieldLabel 变化时，更新字段名称
    useEffect(() => {
        if (!fieldName || fieldName === fieldLabel) {
            setFieldName(fieldLabel);
        }
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [fieldLabel]);
    // 当 initialPromptTemplate 变化时，更新 prompt 值（用于编辑场景）
    useEffect(() => {
        if (initialPromptTemplate) {
            setPromptValue(initialPromptTemplate);
            // 编辑模式下，初始化时已有字段，标记为已初始化，不触发预览
            if (existingColumnCode) {
                const variables = parsePromptVariables(initialPromptTemplate);
                prevVariableCountRef.current = variables.length;
                isInitializedRef.current = true; // 编辑模式初始化完成，不触发预览
            }
        }
        else {
            // 添加模式下，初始化 prevVariableCountRef 为当前 promptValue 的变量数量
            const initialVariables = parsePromptVariables(promptValue);
            prevVariableCountRef.current = initialVariables.length;
        }
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [initialPromptTemplate, existingColumnCode]);
    // 打开弹窗时自动聚焦到字段名称输入框
    useEffect(() => {
        const timer = setTimeout(() => {
            var _a, _b;
            if (fieldNameInputRef.current) {
                const inputNode = ((_b = (_a = fieldNameInputRef.current).getInputNode) === null || _b === void 0 ? void 0 : _b.call(_a)) || fieldNameInputRef.current;
                if (inputNode && typeof inputNode.focus === 'function') {
                    inputNode.focus();
                    if (typeof inputNode.select === 'function') {
                        inputNode.select();
                    }
                }
            }
        }, 100);
        return () => clearTimeout(timer);
    }, []);
    // 获取当前用户工号
    const getUserId = useCallback(() => {
        var _a, _b;
        return ((_b = (_a = window.__PAGE_INFO__) === null || _a === void 0 ? void 0 : _a.user) === null || _b === void 0 ? void 0 : _b.aliWorkNo) || '';
    }, []);
    // 停止预览轮询
    const stopPreviewPolling = useCallback((interrupted = false) => {
        if (previewPollingRef.current) {
            clearTimeout(previewPollingRef.current);
            previewPollingRef.current = null;
            if (interrupted) {
                setPreviewLoading(false);
                setPreviewInterrupted(true);
            }
        }
    }, []);
    /**
     * 判断 prompt 是否有实质性变化（忽略空白字符的微小变化）
     * 比较变量列表和规范化后的文本内容
     */
    const isPromptMeaningfullyChanged = useCallback((oldValue, newValue) => {
        // 比较变量列表
        const oldVars = parsePromptVariables(oldValue).sort().join(',');
        const newVars = parsePromptVariables(newValue).sort().join(',');
        if (oldVars !== newVars) {
            return true;
        }
        // 规范化空白字符后比较（将多个空白字符压缩为单个空格，并去除首尾空白）
        const normalize = (s) => s.replace(/\s+/g, ' ').trim();
        return normalize(oldValue) !== normalize(newValue);
    }, []);
    // 执行预览
    const handlePreview = useCallback(async () => {
        var _a, _b;
        // 验证是否有变量
        if (!hasPromptVariables(promptValue)) {
            setPreviewError($i18n.get({
                id: 'PleaseInsertFieldsInTheTaskDescr_441188635',
                dm: '请先在任务描述中插入字段',
            }));
            return;
        }
        // 获取第一行数据
        const firstRow = (_a = dataModel === null || dataModel === void 0 ? void 0 : dataModel.rawData) === null || _a === void 0 ? void 0 : _a[0];
        if (!firstRow) {
            setPreviewError($i18n.get({ id: 'NoDataAvailableForPreview', dm: '暂无数据可预览' }));
            return;
        }
        // 标记为已预览过
        setNeverPreviewed(false);
        // 在接口请求时补充字段名称
        const enrichedPrompt = getEnrichedPrompt(promptValue);
        // 解析变量并构建 promptParams（格式化显示值优先）
        const variables = parsePromptVariables(enrichedPrompt);
        const allColumns = (dataModel === null || dataModel === void 0 ? void 0 : dataModel.columnDefinitions) || [];
        const processedColumnMap = (dataModel === null || dataModel === void 0 ? void 0 : dataModel.processedColumnMap) || new Map();
        const promptParams = buildPromptParamsWithExtractor(firstRow, variables, allColumns, processedColumnMap, 0);
        setPreviewLoading(true);
        setPreviewResult('');
        setPreviewError('');
        setPreviewInterrupted(false);
        stopPreviewPolling();
        try {
            // 1. 提交预览任务（使用补充后的 prompt）
            const submitResult = await submitAiColumnPreview({
                tableId: (dataModel === null || dataModel === void 0 ? void 0 : dataModel.tableId) || '',
                promptParams,
                scenarioId: AGENT_ID,
                promptTemplate: enrichedPrompt,
                userId: getUserId(),
            }, dataModel === null || dataModel === void 0 ? void 0 : dataModel.bizRequestConfig);
            if (!(submitResult === null || submitResult === void 0 ? void 0 : submitResult.success) || !((_b = submitResult.data) === null || _b === void 0 ? void 0 : _b.taskId)) {
                setPreviewError((submitResult === null || submitResult === void 0 ? void 0 : submitResult.errorMsg) || $i18n.get({ id: 'PreviewRequestFailed', dm: '预览请求失败' }));
                setPreviewLoading(false);
                return;
            }
            const { taskId } = submitResult.data;
            // 2. 轮询查询预览结果
            let pollingCount = 0;
            const pollResult = async () => {
                pollingCount += 1;
                if (pollingCount > PREVIEW_MAX_POLLING_COUNT) {
                    setPreviewError($i18n.get({ id: 'PreviewTimedOutPleaseTryAgain', dm: '预览超时，请重试' }));
                    setPreviewLoading(false);
                    return;
                }
                try {
                    const queryResult = await queryAiColumnPreview({
                        tableId: (dataModel === null || dataModel === void 0 ? void 0 : dataModel.tableId) || '',
                        taskId,
                    }, dataModel === null || dataModel === void 0 ? void 0 : dataModel.bizRequestConfig);
                    if (!(queryResult === null || queryResult === void 0 ? void 0 : queryResult.success)) {
                        setPreviewError((queryResult === null || queryResult === void 0 ? void 0 : queryResult.errorMsg) ||
                            $i18n.get({ id: 'QueryPreviewResultFailed', dm: '查询预览结果失败' }));
                        setPreviewLoading(false);
                        return;
                    }
                    const { status, jobOutput } = queryResult.data || {};
                    if (status === 'finish') {
                        setPreviewResult(jobOutput || '');
                        setPreviewLoading(false);
                    }
                    else if (status === 'failed') {
                        setPreviewError($i18n.get({ id: 'PreviewGenerationFailed', dm: '预览生成失败' }));
                        setPreviewLoading(false);
                    }
                    else {
                        // 继续轮询
                        previewPollingRef.current = setTimeout(pollResult, PREVIEW_POLLING_INTERVAL);
                    }
                }
                catch {
                    setPreviewError($i18n.get({ id: 'QueryPreviewResultFailed', dm: '查询预览结果失败' }));
                    setPreviewLoading(false);
                }
            };
            // 开始轮询
            previewPollingRef.current = setTimeout(pollResult, PREVIEW_POLLING_INTERVAL);
        }
        catch {
            setPreviewError($i18n.get({ id: 'PreviewRequestFailed', dm: '预览请求失败' }));
            setPreviewLoading(false);
        }
    }, [promptValue, dataModel, getUserId, stopPreviewPolling, getEnrichedPrompt]);
    // 处理 prompt 变化
    const handlePromptChange = useCallback((newValue) => {
        const prevHasVariables = hasPromptVariables(promptValue);
        const newHasVariables = hasPromptVariables(newValue);
        const meaningfulChange = isPromptMeaningfullyChanged(promptValue, newValue);
        // 标记初始化完成（用户开始修改内容）
        // 注意：首次插入字段（从0到1）的情况由 useEffect 处理，这里不设置 isInitializedRef
        // 只有当之前已经有变量时，才标记为已初始化
        if (!isInitializedRef.current && meaningfulChange && prevHasVariables) {
            isInitializedRef.current = true;
        }
        setPromptValue(newValue);
        if (validationError && parsePromptVariables(newValue).length > 0) {
            setValidationError('');
        }
        // 如果新的 prompt 没有变量了，清空所有预览状态
        if (!newHasVariables) {
            stopPreviewPolling();
            // 清除自动预览定时器
            if (autoPreviewTimerRef.current) {
                clearTimeout(autoPreviewTimerRef.current);
                autoPreviewTimerRef.current = null;
            }
            setPreviewResult('');
            setPreviewError('');
            setPreviewInterrupted(false);
            return;
        }
        // 只有实质性变化才触发后续逻辑
        if (!meaningfulChange) {
            return;
        }
        // 如果正在轮询，停止并标记为中断（已自动设置 previewInterrupted = true）
        if (previewPollingRef.current) {
            stopPreviewPolling(true);
            return;
        }
        // 如果已完成初始化且有变量，标记为中断（需要重新生成）
        // 不再自动触发预览，用户需要点击"重新生成"按钮
        if (isInitializedRef.current && newHasVariables) {
            // 如果之前是"从未预览过"状态，改为"中断"状态（显示"重新生成"按钮）
            if (neverPreviewed) {
                setNeverPreviewed(false);
            }
            setPreviewResult('');
            setPreviewError('');
            setPreviewInterrupted(true);
        }
    }, [validationError, stopPreviewPolling, promptValue, isPromptMeaningfullyChanged, neverPreviewed]);
    // 组件卸载时清理轮询和自动预览定时器
    useEffect(() => {
        return () => {
            stopPreviewPolling();
            if (autoPreviewTimerRef.current) {
                clearTimeout(autoPreviewTimerRef.current);
                autoPreviewTimerRef.current = null;
            }
        };
    }, [stopPreviewPolling]);
    // 监听首次插入字段，自动触发预览（仅首次插入时触发，后续修改不再自动触发）
    useEffect(() => {
        var _a;
        const currentVariables = parsePromptVariables(promptValue);
        const currentCount = currentVariables.length;
        const prevCount = prevVariableCountRef.current;
        // 当从 0 个变量变成 >= 1 个变量时，自动触发预览（仅首次插入字段时）
        // 编辑模式初始化时已有字段（isInitializedRef.current = true），不会触发（因为 prevCount 不为 0）
        // 添加模式初始化时没有字段（isInitializedRef.current = false），首次插入字段时会触发
        // 之后的所有修改（添加字段、删除字段、修改prompt等）都不会自动触发预览，需要点击"重新生成"按钮
        if (prevCount === 0 &&
            currentCount >= 1 &&
            !isInitializedRef.current &&
            ((_a = dataModel === null || dataModel === void 0 ? void 0 : dataModel.rawData) === null || _a === void 0 ? void 0 : _a.length) > 0) {
            handlePreview();
            // 标记为已初始化，后续变化不再自动触发预览
            isInitializedRef.current = true;
        }
        // 更新上一次的变量数量（在检查之后更新）
        prevVariableCountRef.current = currentCount;
    }, [promptValue, (_a = dataModel === null || dataModel === void 0 ? void 0 : dataModel.rawData) === null || _a === void 0 ? void 0 : _a.length, handlePreview]);
    // 获取配置
    // 在获取配置时统一补充字段名称，确保 onSave 拿到的是补充后的 prompt
    const getConfig = () => {
        const enrichedPrompt = getEnrichedPrompt(promptValue);
        return {
            fieldName,
            aiTaskType: getAiTaskType(fieldType),
            targetInfo: enrichedPrompt, // 补充字段名后的 prompt（用于接口请求）
            content: promptValue, // 原始 prompt（用于编辑时回显）
            model,
            autoUpdate,
            allowEmptyField: false,
            columnCode: generateColumnCode(existingColumnCode),
        };
    };
    // 处理保存按钮点击 - 显示确认对话框
    const handleSaveClick = () => {
        if (!validateForm())
            return;
        setConfirmDialogVisible(true);
    };
    // 仅保存配置
    const handleSaveConfigOnly = () => {
        if (isEditStatus) {
            onSave(getConfig(), 'config-only');
            setConfirmDialogVisible(false);
        }
    };
    // 生成前5行
    const handleGenerateFirst5Rows = () => {
        onSave(getConfig(), 'first-5-rows');
        setConfirmDialogVisible(false);
    };
    // 生成全列
    const handleGenerateAllRows = () => {
        onSave(getConfig(), 'all-rows');
        setConfirmDialogVisible(false);
    };
    // 处理保存前5行（底部按钮）
    const handleSaveFirst5Rows = () => {
        if (!validateForm())
            return;
        onSave(getConfig(), 'first-5-rows');
    };
    // 是否正在处理中
    const isProcessing = saving || executing;
    // 处理取消
    const handleCancel = () => {
        setFieldName(fieldLabel);
        setPromptValue(getDefaultPromptByFieldType(fieldType));
        setAutoUpdate(false);
        setConfirmDialogVisible(false);
        setValidationError('');
        onCancel();
    };
    // 处理确认对话框关闭
    const handleConfirmDialogClose = () => {
        setConfirmDialogVisible(false);
    };
    return (React.createElement(React.Fragment, null,
        React.createElement("div", { className: "ai-field-config-panel" },
            React.createElement("div", { className: "ai-field-config-header" },
                React.createElement("div", { className: "ai-field-config-header-left" },
                    React.createElement(CnIcon, { type: "wand", style: { color: '#722ed1', fontSize: '16px' } }),
                    React.createElement("span", { className: "ai-field-config-title" }, $i18n.get({ id: 'AIField', dm: 'AI字段' }))),
                React.createElement(CnIcon, { type: "close", size: "small", onClick: handleCancel })),
            React.createElement("div", { className: "ai-field-config-content" },
                React.createElement("div", { className: "ai-field-config-section" },
                    React.createElement("div", { className: "ai-field-config-label" }, $i18n.get({ id: 'FieldName', dm: '字段名称' })),
                    React.createElement(CnInput, { ref: fieldNameInputRef, value: fieldName, onChange: setFieldName, placeholder: $i18n.get({ id: 'PleaseEnterAFieldName', dm: '请输入字段名称' }), style: { width: '100%' } })),
                React.createElement("div", { className: "ai-field-config-section" },
                    React.createElement("div", { className: "ai-field-config-label" }, $i18n.get({ id: 'AITaskDescription', dm: 'AI任务描述' })),
                    React.createElement(PromptEditor, { ref: promptEditorRef, value: promptValue, onChange: handlePromptChange, fields: getAvailableFields(), placeholder: $i18n.get({
                            id: 'PleaseEnterAITaskDescriptionAndC_840720935',
                            dm: '请输入AI任务描述，点击下方按钮插入字段变量...',
                        }), hasError: !!validationError, minHeight: 150, model: model, onModelChange: setModel }),
                    validationError && (React.createElement("div", { className: "ai-field-config-validation-error" }, validationError))),
                React.createElement("div", { className: "ai-field-config-section" },
                    React.createElement("div", { className: "ai-field-config-label", style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },
                        React.createElement("span", null, $i18n.get({ id: 'PreviewFirstLineOfData', dm: '预览（首行数据）' }))),
                    React.createElement("div", { className: "ai-field-config-preview" },
                        React.createElement(PreviewContent, { loading: previewLoading, error: previewError, result: previewResult, interrupted: previewInterrupted, hasVariables: hasPromptVariables(promptValue), neverPreviewed: neverPreviewed, onRegenerate: handlePreview })))),
            React.createElement("div", { className: "ai-field-config-footer" },
                React.createElement(CnButton, { text: true, onClick: () => { } }),
                React.createElement("div", { style: { display: 'flex', gap: '8px' } },
                    React.createElement(CnButton, { onClick: handleCancel, disabled: isProcessing }, $i18n.get({ id: 'Cancel', dm: '取消' })),
                    React.createElement(CnButton, { onClick: handleSaveFirst5Rows, loading: executing, disabled: isProcessing }, $i18n.get({ id: 'SaveTheFirst5Rows', dm: '保存前5行' })),
                    React.createElement(CnButton, { type: "primary", onClick: handleSaveClick, loading: saving, disabled: isProcessing }, $i18n.get({ id: 'Save', dm: '保存' }))))),
        React.createElement(ConfirmDialog, { isEditStatus: isEditStatus, visible: confirmDialogVisible, onClose: handleConfirmDialogClose, onSaveConfigOnly: handleSaveConfigOnly, onGenerateFirst5Rows: handleGenerateFirst5Rows, onGenerateAllRows: handleGenerateAllRows, saving: saving, executing: executing, isProcessing: isProcessing })));
}
