import type { XYPosition } from '@repo/workflow'
import type { FormItemRule } from 'element-plus'
import type { VNode } from 'vue'

/**
 * 渲染回调参数
 */
export interface RenderCallbackParams {
	[key: string]: any
}

/**
 * 表单项配置模型
 */
export interface ConfigSchema {
	// 其他未明确指定的属性
	[fieldName: string]: any
	/**
	 * 子节点列表，可选
	 */
	children?: ConfigSchema[]
	/**
	 * 表单控件属性，可选
	 * @example { type: 'input', options: [{ label: '用户名', value: 'username' }] }
	 */
	componentProps?: any
	/**
	 * 节点字段path，可选 获取参考lodash get方法
	 * @example 'data.username'
	 */
	field?: string
	// 是否为表单输入组件，可选
	input?: boolean
	// 节点标签，可选
	label?: string
	/**
	 * 是否在物料库中隐藏
	 */
	hideInLibary?: boolean
	/**
	 * 标签配置
	 */
	labelConfig?: {
		/**
		 * 宽度，可选
		 */
		width?: number
		/**
		 * 是否显示，可选
		 */
		show?: boolean
		/**
		 * 位置，可选
		 */
		position?: 'top' | 'left'
		/**
		 * 配置提示
		 */
		tooltip?: string
	}
	// 是否无需表单项，可选
	noFormItem?: boolean
	// 事件绑定
	// 表单验证规则，可选
	rules?: FormItemRule[]
	// 是否显示（属性编辑组件可以添加函数动态显示隐藏），可选
	show?: ((renderCallbackParams: RenderCallbackParams) => boolean) | boolean
	// 插槽名称（组件为插槽类型时，需要设置插槽name），可选
	slotName?: string
	// 插槽列表，可选
	slots?: { [slotName: string]: ConfigSchema[] }
	/**
	 * 节点类型，必选
	 * @example 'text' | 'textarea' | 'select' | 'checkbox' | 'radio' | 'switch' | 'date' | 'time' | 'datetime' | 'color' | 'file' | 'image' | 'video' | 'audio' | 'range' | 'number' | 'password' | 'hidden' | 'button' | 'reset' | 'submit' | 'html' | 'custom'
	 */
	valueType: string
	// 渲染表单项
	render?: (renderCallbackParams: RenderCallbackParams) => Element
	// 渲染组件
	renderItem?: (renderCallbackParams: RenderCallbackParams) => Element
}

export type EndpointType =
	| string
	| { type: string; label: string; id: string; labelStyle?: Record<string, any> }

export interface INodeType {
	/**
	 * 版本信息
	 */
	version: string[]
	/**
	 * 所属分组
	 */
	group?: 'start' | 'logic' | 'data' | 'tool' | 'other' | 'custom'
	/**
	 * 展示名称
	 */
	displayName: string
	/**
	 * 名称
	 */
	name: string
	/**
	 * 副标题 带格式化信息
	 */
	subtitle?: string
	/**
	 * 描述
	 */
	description?: string
	/**
	 * 节点图标 默认使用iconify图标名称
	 * @example 'mdi:home'
	 * 参考 https://icon-sets.iconify.design/
	 */
	icon?: string
	/**
	 * 图标颜色
	 */
	iconColor?: string
	/**
	 * 输入端口列表
	 */
	inputs: EndpointType[] | ((params: any) => EndpointType[])
	/**
	 * 输出端口列表
	 */
	outputs: EndpointType[] | ((params: any) => EndpointType[])
	/**
	 * 隐藏显示工具栏
	 */
	hideToolBar?: boolean
	/**
	 * 输出端口名称
	 */
	schema: {
		// 流程id
		appAgentId?: string
		// 父级节点Id
		parentId?: string
		// 节点位置
		position: XYPosition
		// 节点宽度
		width: number
		// 节点高度
		height: number
		// 当前是否选中
		selected: boolean
		// 节点类型
		nodeType: string
		// 节点层级
		zIndex: number
		// 节点业务数据 存储配置等
		data: Record<string, any>
	}
	/**
	 * 表单配置
	 */
	formConfig?: ConfigSchema[]
	/**
	 * 节点自定义渲染
	 */
	render?: (renderCallbackParams: RenderCallbackParams) => Element | VNode
	/**
	 * 配置校验
	 */
	validate?: (data: any) => boolean | string | Promise<boolean | string>
	/**
	 * 节点副标题
	 */
	getSubtitle?: (data: any) => string | Promise<string> | undefined
	// 其他配置
	[key: string]: any
}

/**
 * 节点连接类型
 */
export const NodeConnectionTypes = {
	main: 'main'
}

/**
 * 节点变量类型
 */
export type NodeVariableType =
	| 'string'
	| 'number'
	| 'boolean'
	| 'object'
	| 'array[string]'
	| 'array[number]'
	| 'array[boolean]'
	| 'array[object]'
	| 'array[file]'

/**
 * 节点变量值类型
 */
export type NodeVariableValueType = 'constant' | 'variable'

/**
 * 节点变量
 */
export interface NodeVariable {
	name: string
	describe?: string
	type?: NodeVariableType
	value?: any
	value_type?: NodeVariableValueType
}

/**
 * 节点重试配置
 */
export interface NodeRetryConfig {
	retry_enabled: boolean
	max_retries: number
	retry_interval: number // milliseconds
}

/**
 * 节点错误处理策略
 */
export type NodeErrorStrategy = 'none' | 'default-value' | 'fail-branch'

/**
 * 节点类型
 */
export type NodeType =
	| 'http-request'
	| 'code'
	| 'if-else'
	| 'iteration'
	| 'iteration-start'
	| 'list-operator'
	| 'loop'
	| 'loop-start'
	| 'end'
	| string

/**
 * 节点公共配置信息
 */
export interface INodeDataBaseSchema {
	/**
	 * 节点类型
	 */
	type: NodeType
	/**
	 * 标题
	 */
	title: string
	/**
	 * 是否在迭代中
	 */
	isInIteration: boolean
	/**
	 * 迭代id
	 */
	iteration_id: string
	/**
	 * 是否在循环中
	 */
	isInLoop: boolean
	/**
	 * 循环id
	 */
	loop_id: string
	/**
	 * 输入变量列表
	 */
	variables: NodeVariable[]
	/**
	 * 重试配置
	 */
	retry_config: NodeRetryConfig
	/**
	 * 错误处理策略
	 */
	error_strategy: NodeErrorStrategy
	/**
	 * 失败分支节点id
	 */
	fail_branch_node_id: string
	/**
	 * 默认值
	 */
	default_value: NodeVariable[]
	/**
	 * 输出变量是否可修改
	 */
	output_can_alter: boolean
	/**
	 * 输出变量列表
	 */
	outputs: NodeVariable[]

	/**
	 * 节点id
	 */
	id?: string
}

/**
 * 条件项类型
 */
export interface ConditionType {
	/**
	 * 比较操作符
	 * 可选值: contains, not_contains, start_with, end_with, is, is_not, empty, not_empty, =, !=, >, <, ≥, ≤, all_of
	 */
	comparison_operator:
		| 'contains'
		| 'not_contains'
		| 'start_with'
		| 'end_with'
		| 'is'
		| 'is_not'
		| 'empty'
		| 'not_empty'
		| '='
		| '!='
		| '>'
		| '<'
		| '≥'
		| '≤'
		| 'all_of'

	/**
	 * 左值，支持常量或#{}方式的动态变量
	 */
	left_value: string

	/**
	 * 右值，支持常量或#{}方式的动态变量
	 */
	right_value: string

	/**
	 * 右值列表，预留
	 */
	right_value_list?: string[]

	/**
	 * 变量类型
	 * 可选值: string | number | boolean | object | array[string] | array[number] | array[boolean] | array[object] | array[file]
	 */
	varType:
		| 'string'
		| 'number'
		| 'boolean'
		| 'object'
		| 'array[string]'
		| 'array[number]'
		| 'array[boolean]'
		| 'array[object]'
		| 'array[file]'
}

/**
 * 文件类型
 */
export interface FileType {
	id: string
	name: string
	extensionName: string
	size: number
	path: string
}

/**
 * 文本类型
 */
export interface TextType {
	id: string
	parentId: string
	isRoot: boolean
	path: string
	text: string
	value: string
	displayOrder: number
}

/**
 * 输出视图数据
 * view-data-output
 */
export interface ViewDataOutput {
	viewTable: [] // "数据列表",
	viewName: string // "视图名称",
	totalCount: number // "数据总数",
}
