using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using AI.Models.Form;
namespace AI.Models.SpecialMessages
{
///
/// 表单请求特殊消息 - 在聊天流中显示可填写的表单
///
public class FormRequestMessage : ISpecialMessage, INotifyPropertyChanged
{
private string _submitLabel = "提交";
/// 消息唯一标识符
public string Id { get; set; } = Guid.NewGuid().ToString();
/// 类型名称
public string TypeName => "Form";
/// 不需要实时更新
public bool IsLive => false;
/// 表单定义(只读)
public FormDefinition Definition { get; }
/// 带当前值的字段列表,用于绑定与提交
public ObservableCollection FieldsWithValues { get; } = new ObservableCollection();
/// 提交按钮文案(可从 Definition 覆盖)
public string SubmitLabel
{
get => _submitLabel;
set => SetProperty(ref _submitLabel, value);
}
public FormRequestMessage(FormDefinition definition)
{
Definition = definition ?? throw new ArgumentNullException(nameof(definition));
_submitLabel = definition.SubmitLabel;
foreach (var f in definition.Fields)
{
var entry = new FormFieldEntry
{
Id = f.Id,
Label = f.Label,
Description = f.Description,
Type = f.Type,
Required = f.Required,
DefaultValue = f.DefaultValue,
Options = f.Options,
Min = f.Min,
Max = f.Max,
Step = f.Step,
MaxLength = f.MaxLength,
Placeholder = f.Placeholder,
DefaultValues = f.DefaultValues != null ? new List(f.DefaultValues) : null,
CurrentValue = f.DefaultValue?.ToString() ?? string.Empty,
};
if (f.Type == FormFieldType.MultiSelect)
{
if (f.DefaultValues != null && f.DefaultValues.Count > 0)
{
foreach (var v in f.DefaultValues)
entry.SelectedValues.Add(v);
}
else if (f.DefaultValue is System.Collections.IEnumerable en && f.DefaultValue is not string)
{
foreach (var v in en)
entry.SelectedValues.Add(v?.ToString() ?? string.Empty);
}
else if (f.DefaultValue is string defStr && !string.IsNullOrEmpty(defStr))
{
foreach (var v in defStr.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
entry.SelectedValues.Add(v);
}
if (f.Options != null)
{
foreach (var opt in f.Options)
entry.MultiSelectOptions.Add(new MultiSelectOptionItem(entry, opt, entry.SelectedValues.Contains(opt)));
}
}
FieldsWithValues.Add(entry);
}
}
/// 收集当前值,用于提交。Key 为字段 Id,Value 为对象(按 Type 转换)
public Dictionary GetValues()
{
var dict = new Dictionary(StringComparer.OrdinalIgnoreCase);
foreach (var entry in FieldsWithValues)
{
var raw = entry.CurrentValue?.Trim() ?? string.Empty;
object value = entry.Type switch
{
FormFieldType.Number => double.TryParse(raw, out var n) ? n : 0d,
FormFieldType.Boolean => raw is "1" or "true" or "True" or "yes" or "是",
FormFieldType.Json => raw,
FormFieldType.MultiSelect => entry.SelectedValues.Count > 0
? new List(entry.SelectedValues)
: (object)raw.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToList(),
_ => raw,
};
dict[entry.Id] = value;
}
return dict;
}
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null)
{
if (EqualityComparer.Default.Equals(field, value))
return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
}
}