package system

// DataSource 数据源
type DataSource struct {
	DBName       string `json:"dbName"`
	Table        string `json:"table"`
	Label        string `json:"label"`
	Value        string `json:"value"`
	Association  int    `json:"association"` // 关联关系 1 一对一 2 一对多
	HasDeletedAt bool   `json:"hasDeletedAt"`
}

// AutoCodeField 自动代码字段
type AutoCodeField struct {
	FieldName       string      `json:"fieldName"`       // Field名
	FieldDesc       string      `json:"fieldDesc"`       // 中文名
	FieldType       string      `json:"fieldType"`       // Field数据类型
	FieldJson       string      `json:"fieldJson"`       // FieldJson
	DataTypeLong    string      `json:"dataTypeLong"`    // 数据库字段长度
	Comment         string      `json:"comment"`         // 数据库字段描述
	ColumnName      string      `json:"columnName"`      // 数据库字段
	FieldSearchType string      `json:"fieldSearchType"` // 搜索条件
	FieldSearchHide bool        `json:"fieldSearchHide"` // 是否隐藏查询条件
	DictType        string      `json:"dictType"`        // 字典
	Form            bool        `json:"form"`            // 是否前端新建/编辑
	Table           bool        `json:"table"`           // 是否前端表格列
	Desc            bool        `json:"desc"`            // 是否前端详情
	Excel           bool        `json:"excel"`           // 是否导入/导出
	Require         bool        `json:"require"`         // 是否必填
	DefaultValue    string      `json:"defaultValue"`    // 默认值
	ErrorText       string      `json:"errorText"`       // 校验失败文字
	Clearable       bool        `json:"clearable"`       // 是否可清空
	Sort            bool        `json:"sort"`            // 是否增加排序
	PrimaryKey      bool        `json:"primaryKey"`      // 是否主键
	DataSource      *DataSource `json:"dataSource"`      // 数据源
	CheckDataSource bool        `json:"checkDataSource"` // 是否检查数据源
	FieldIndexType  string      `json:"fieldIndexType"`  // 索引类型
}

// AutoCodeRequest 自动代码生成请求
type AutoCodeRequest struct {
	Package             string                 `json:"package"`
	PackageT            string                 `json:"-"`
	TableName           string                 `json:"tableName"`           // 表名
	BusinessDB          string                 `json:"businessDB"`          // 业务数据库
	StructName          string                 `json:"structName"`          // Struct名称
	PackageName         string                 `json:"packageName"`         // 文件名称
	Description         string                 `json:"description"`         // Struct中文名称
	Abbreviation        string                 `json:"abbreviation"`        // Struct简称
	HumpPackageName     string                 `json:"humpPackageName"`     // go文件名称
	GvaModel            bool                   `json:"gvaModel"`            // 是否使用默认Model（保留字段名以兼容前端）
	AutoMigrate         bool                   `json:"autoMigrate"`         // 是否自动迁移表结构
	AutoCreateResource  bool                   `json:"autoCreateResource"`  // 是否自动创建资源标识
	AutoCreateApiToSql  bool                   `json:"autoCreateApiToSql"`  // 是否自动创建api
	AutoCreateMenuToSql bool                   `json:"autoCreateMenuToSql"` // 是否自动创建menu
	AutoCreateBtnAuth   bool                   `json:"autoCreateBtnAuth"`   // 是否自动创建按钮权限
	OnlyTemplate        bool                   `json:"onlyTemplate"`        // 是否只生成模板
	IsTree              bool                   `json:"isTree"`              // 是否树形结构
	TreeJson            string                 `json:"treeJson"`            // 展示的树json字段
	IsAdd               bool                   `json:"isAdd"`               // 是否新增
	Fields              []*AutoCodeField       `json:"fields"`
	GenerateWeb         bool                   `json:"generateWeb"`    // 是否生成web
	GenerateServer      bool                   `json:"generateServer"` // 是否生成server
	Module              string                 `json:"-"`
	DictTypes           []string               `json:"-"`
	PrimaryField        *AutoCodeField         `json:"primaryField"`
	DataSourceMap       map[string]*DataSource `json:"-"`
	HasPic              bool                   `json:"-"`
	HasFile             bool                   `json:"-"`
	HasTimer            bool                   `json:"-"`
	NeedSort            bool                   `json:"-"`
	NeedJSON            bool                   `json:"-"`
	HasRichText         bool                   `json:"-"`
	HasDataSource       bool                   `json:"-"`
	HasSearchTimer      bool                   `json:"-"`
	HasArray            bool                   `json:"-"`
	HasExcel            bool                   `json:"-"`
	CustomMethods       []*CustomMethod        `json:"customMethods"` // 自定义查询方法
	HasCustomMethods    bool                   `json:"-"`             // 是否有自定义查询方法
}

// CustomMethod 自定义查询方法
// 用于在 GORM Gen 生成的代码中添加自定义查询方法
type CustomMethod struct {
	Name        string               `json:"name"`        // 方法名称 (如: FindByName, GetActiveUsers)
	Description string               `json:"description"` // 方法描述
	ReturnType  string               `json:"returnType"`  // 返回类型: single(单个), list(列表), count(计数), exists(存在检查)
	Params      []*CustomMethodParam `json:"params"`      // 方法参数
	Conditions  []*CustomCondition   `json:"conditions"`  // 查询条件
	OrderBy     string               `json:"orderBy"`     // 排序字段 (如: created_at DESC)
	Limit       int                  `json:"limit"`       // 限制数量 (0表示不限制)
}

// CustomMethodParam 自定义方法参数
type CustomMethodParam struct {
	Name      string `json:"name"`      // 参数名称
	Type      string `json:"type"`      // 参数类型 (string, int, uint, bool, time.Time等)
	FieldName string `json:"fieldName"` // 对应的字段名 (用于生成查询条件)
}

// CustomCondition 自定义查询条件
type CustomCondition struct {
	FieldName string `json:"fieldName"` // 字段名
	Operator  string `json:"operator"`  // 操作符: eq, neq, gt, gte, lt, lte, like, in, between, isNull, isNotNull
	ParamName string `json:"paramName"` // 参数名 (对应 CustomMethodParam.Name)
}

// AutoFuncRequest 自动函数生成请求
type AutoFuncRequest struct {
	Package         string `json:"package"`
	FuncName        string `json:"funcName"`        // 方法名称
	Router          string `json:"router"`          // 路由名称
	FuncDesc        string `json:"funcDesc"`        // 方法介绍
	BusinessDB      string `json:"businessDB"`      // 业务库
	StructName      string `json:"structName"`      // Struct名称
	PackageName     string `json:"packageName"`     // 文件名称
	Description     string `json:"description"`     // Struct中文名称
	Abbreviation    string `json:"abbreviation"`    // Struct简称
	HumpPackageName string `json:"humpPackageName"` // go文件名称
	Method          string `json:"method"`          // 方法
	IsPlugin        bool   `json:"isPlugin"`        // 是否插件
	IsAuth          bool   `json:"isAuth"`          // 是否鉴权
	IsPreview       bool   `json:"isPreview"`       // 是否预览
	IsAi            bool   `json:"isAi"`            // 是否AI
	ApiFunc         string `json:"apiFunc"`         // API方法
	ServerFunc      string `json:"serverFunc"`      // 服务方法
	JsFunc          string `json:"jsFunc"`          // JS方法
}

// InitMenuRequest 初始化菜单请求
type InitMenuRequest struct {
	PlugName   string `json:"plugName"`
	ParentMenu string `json:"parentMenu"`
	Menus      []uint `json:"menus"`
}

// InitApiRequest 初始化API请求
type InitApiRequest struct {
	PlugName string `json:"plugName"`
	APIs     []uint `json:"apis"`
}

// LLMAutoCodeRequest LLM自动代码生成请求
type LLMAutoCodeRequest struct {
	Prompt string `json:"prompt" form:"prompt"` // 提示语
	Mode   string `json:"mode" form:"mode"`     // 模式
}

// AutoMcpToolRequest MCP工具生成请求
type AutoMcpToolRequest struct {
	Name        string `json:"name"`        // 工具名称
	Description string `json:"description"` // 工具描述
	InputSchema string `json:"inputSchema"` // 输入模式
}

// SysAutoCodePackageCreateRequest 创建代码包请求
type SysAutoCodePackageCreateRequest struct {
	Desc        string `json:"desc"`
	Label       string `json:"label"`
	Template    string `json:"template"`
	PackageName string `json:"packageName"`
}

// SysAutoHistoryCreateRequest 创建历史记录请求
type SysAutoHistoryCreateRequest struct {
	Table            string            `json:"tableName"`
	Package          string            `json:"package"`
	Request          string            `json:"request"`
	StructName       string            `json:"structName"`
	BusinessDB       string            `json:"businessDb"`
	Description      string            `json:"description"`
	Templates        map[string]string `json:"templates"`
	Injections       map[string]string `json:"injections"`
	ApiIDs           []uint            `json:"apiIDs"`
	MenuID           uint              `json:"menuId"`
	ExportTemplateID uint              `json:"exportTemplateID"`
}

// SysAutoHistoryRollBackRequest 回滚请求
type SysAutoHistoryRollBackRequest struct {
	ID          uint `json:"id"`
	DeleteApi   bool `json:"deleteApi"`
	DeleteMenu  bool `json:"deleteMenu"`
	DeleteTable bool `json:"deleteTable"`
}

// GetByIdRequest 根据ID获取请求
type GetByIdRequest struct {
	ID uint `json:"ID" form:"ID"`
}

// PageInfoRequest 分页请求
type PageInfoRequest struct {
	Page     int `json:"page" form:"page"`
	PageSize int `json:"pageSize" form:"pageSize"`
}

// AutoMcpToolDetailRequest MCP工具详情请求
type AutoMcpToolDetailRequest struct {
	Name        string             `json:"name" form:"name" binding:"required"`
	Description string             `json:"description" form:"description" binding:"required"`
	Params      []AutoMcpToolParam `json:"params" form:"params"`
	Response    []AutoMcpToolResp  `json:"response" form:"response"`
}

// AutoMcpToolParam MCP工具参数
type AutoMcpToolParam struct {
	Name        string `json:"name" form:"name" binding:"required"`
	Description string `json:"description" form:"description" binding:"required"`
	Type        string `json:"type" form:"type" binding:"required"` // string, number, boolean, object, array
	Required    bool   `json:"required" form:"required"`
	Default     string `json:"default" form:"default"`
}

// AutoMcpToolResp MCP工具响应
type AutoMcpToolResp struct {
	Type string `json:"type" form:"type" binding:"required"` // text, image
}

// DbResponse 数据库响应
type DbResponse struct {
	Database string `json:"database" gorm:"column:database"`
}

// TableResponse 表响应
type TableResponse struct {
	TableName string `json:"tableName" gorm:"column:table_name"`
}

// ColumnResponse 列响应
type ColumnResponse struct {
	DataType      string `json:"dataType" gorm:"column:data_type"`
	ColumnName    string `json:"columnName" gorm:"column:column_name"`
	DataTypeLong  string `json:"dataTypeLong" gorm:"column:data_type_long"`
	ColumnComment string `json:"columnComment" gorm:"column:column_comment"`
	PrimaryKey    bool   `json:"primaryKey" gorm:"column:primary_key"`
}

// AutoCodeHistoryInfo 自动代码历史信息
type AutoCodeHistoryInfo struct {
	ID               uint              `json:"ID"`
	Table            string            `json:"tableName"`
	Package          string            `json:"package"`
	Request          string            `json:"request"`
	StructName       string            `json:"structName"`
	BusinessDB       string            `json:"businessDB"`
	Description      string            `json:"description"`
	Templates        map[string]string `json:"templates"`
	Injections       map[string]string `json:"injections"`
	ApiIDs           []uint            `json:"apiIDs"`
	MenuID           uint              `json:"menuID"`
	ExportTemplateID uint              `json:"exportTemplateID"`
}

// AutoCodePackageInfo 自动代码包信息
type AutoCodePackageInfo struct {
	ID          uint   `json:"ID"`
	Desc        string `json:"desc"`
	Label       string `json:"label"`
	Template    string `json:"template"`
	PackageName string `json:"packageName"`
	Module      string `json:"module"`
}

// GetAutoCodeHistoryListRequest 获取自动代码历史列表请求
type GetAutoCodeHistoryListRequest struct {
	Page     int `json:"page" form:"page"`
	PageSize int `json:"pageSize" form:"pageSize"`
}

// GetAutoCodeHistoryListReply 获取自动代码历史列表响应
type GetAutoCodeHistoryListReply struct {
	List     []AutoCodeHistoryInfo `json:"list"`
	Total    int64                 `json:"total"`
	Page     int                   `json:"page"`
	PageSize int                   `json:"pageSize"`
}

// GetAutoCodePackageListRequest 获取自动代码包列表请求
type GetAutoCodePackageListRequest struct {
	Page     int `json:"page" form:"page"`
	PageSize int `json:"pageSize" form:"pageSize"`
}

// GetAutoCodePackageListReply 获取自动代码包列表响应
type GetAutoCodePackageListReply struct {
	List     []AutoCodePackageInfo `json:"list"`
	Total    int64                 `json:"total"`
	Page     int                   `json:"page"`
	PageSize int                   `json:"pageSize"`
}
