import type { ChatImageAttachment } from '@easyflow/common-ui';

import { resolveWorkflowParameterLabel } from './workflowFormParameters';
import {
  getWorkflowImagePreviewUrl,
  normalizeWorkflowImageValue,
} from './workflowImageValue';

export interface WorkflowFormParameterSummary {
  key: string;
  label: string;
  ready: boolean;
  required: boolean;
  value: string;
}

/**
 * 判断附加表单是否存在必填参数。
 *
 * @param parameters 附加表单参数
 * @returns 存在必填参数时返回 true
 */
export function hasRequiredWorkflowFormParameters(parameters: any[]) {
  return parameters.some((parameter) => parameter?.required === true);
}

/**
 * 构建用户可读的表单填写内容。
 *
 * @param parameters 附加表单参数
 * @param values 表单值
 * @returns 非空字段组成的多行文本
 */
export function buildWorkflowFormSubmissionText(
  parameters: any[],
  values: Record<string, any>,
) {
  return parameters
    .map((parameter) => {
      if (parameter?.contentType === 'image') {
        return '';
      }
      const value = formatWorkflowFormValue(values[parameter?.name]);
      if (!value) {
        return '';
      }
      const label = String(
        parameter?.formLabel || parameter?.name || '补充信息',
      ).trim();
      return `${label}：${value}`;
    })
    .filter(Boolean)
    .join('\n');
}

/**
 * 构建运行参数的紧凑摘要。
 *
 * @param parameters 运行参数
 * @param values 表单值
 * @returns 可用于收起态展示的参数摘要
 */
export function buildWorkflowFormParameterSummaries(
  parameters: any[],
  values: Record<string, any>,
): WorkflowFormParameterSummary[] {
  return parameters.map((parameter) => {
    const value = formatWorkflowFormValue(values[parameter?.name]);
    return {
      key: String(parameter?.name || ''),
      label: resolveWorkflowParameterLabel(parameter),
      ready: Boolean(value),
      required: parameter?.required === true,
      value: value || '待填写',
    };
  });
}

/**
 * 将图片表单字段转换为聊天图片附件。
 *
 * @param parameters 附加表单参数
 * @param values 表单值
 * @returns 可直接渲染的图片附件
 */
export function buildWorkflowFormSubmissionImages(
  parameters: any[],
  values: Record<string, any>,
): ChatImageAttachment[] {
  return parameters.flatMap((parameter) => {
    if (parameter?.contentType !== 'image') {
      return [];
    }
    const value = values[parameter?.name];
    const image = normalizeWorkflowImageValue(value);
    const previewUrl = getWorkflowImagePreviewUrl(value);
    if (!image || !previewUrl) {
      return [];
    }
    return [
      {
        mimeType: image.sourceType === 'url' ? undefined : image.contentType,
        name:
          image.sourceType === 'url'
            ? resolveWorkflowImageUrlName(image.url)
            : image.fileName,
        previewUrl,
        size: image.sourceType === 'url' ? undefined : image.size,
        status: 'ready' as const,
      },
    ];
  });
}

/**
 * 将表单字段值转换为适合会话展示的文本。
 *
 * @param value 表单字段值
 * @returns 用户可读文本；空值返回空字符串
 */
export function formatWorkflowFormValue(value: any): string {
  if (value === null || value === undefined || value === '') {
    return '';
  }
  if (Array.isArray(value)) {
    return value
      .map((item) => formatWorkflowFormValue(item))
      .filter(Boolean)
      .join('、');
  }
  if (typeof value === 'boolean') {
    return value ? '是' : '否';
  }
  if (typeof value === 'object') {
    for (const key of ['fileName', 'resourceName', 'name', 'url', 'text']) {
      const displayValue = formatWorkflowFormValue(value[key]);
      if (displayValue) {
        return displayValue;
      }
    }
    return Object.keys(value).length > 0 ? '已填写' : '';
  }
  return String(value).trim();
}

/**
 * 从图片 URL 中提取用于预览的文件名。
 *
 * @param url 图片 URL
 * @returns 文件名；无法提取时返回“图片”
 */
function resolveWorkflowImageUrlName(url: string): string {
  try {
    const segments = new URL(url).pathname.split('/');
    for (let index = segments.length - 1; index >= 0; index -= 1) {
      const segment = segments[index];
      if (segment) {
        return decodeURIComponent(segment);
      }
    }
    return '图片';
  } catch {
    return '图片';
  }
}
