package system

import (
	"context"
	"go/ast"
	"io"
)

// SysApi API实体
type SysApi struct {
	ID          uint   `json:"ID" gorm:"primarykey"`
	Path        string `json:"path" gorm:"comment:api路径"`
	Description string `json:"description" gorm:"comment:api中文描述"`
	ApiGroup    string `json:"apiGroup" gorm:"comment:api组"`
	Method      string `json:"method" gorm:"default:POST;comment:方法"`
}

func (SysApi) TableName() string {
	return "sys_apis"
}

// Meta 菜单元信息
type Meta struct {
	Title       string `json:"title" gorm:"comment:菜单名"`
	Icon        string `json:"icon" gorm:"comment:菜单图标"`
	DefaultMenu bool   `json:"defaultMenu" gorm:"comment:是否是基础路由（开发中）"`
	CloseTab    bool   `json:"closeTab" gorm:"comment:自动关闭tab"`
	KeepAlive   bool   `json:"keepAlive" gorm:"comment:是否缓存"`
}

// SysBaseMenu 菜单实体
type SysBaseMenu struct {
	ID         uint                   `json:"ID" gorm:"primarykey"`
	ParentId   uint                   `json:"parentId" gorm:"comment:父菜单ID"`
	Path       string                 `json:"path" gorm:"comment:路由path"`
	Name       string                 `json:"name" gorm:"comment:路由name"`
	Hidden     bool                   `json:"hidden" gorm:"comment:是否在列表隐藏"`
	Component  string                 `json:"component" gorm:"comment:对应前端文件路径"`
	Sort       int                    `json:"sort" gorm:"comment:排序标记"`
	Meta       Meta                   `json:"meta" gorm:"embedded;comment:附加属性"`
	MenuBtn    []SysBaseMenuBtn       `json:"menuBtn" gorm:"-"`
	Parameters []SysBaseMenuParameter `json:"parameters" gorm:"-"`
}

func (SysBaseMenu) TableName() string {
	return "sys_base_menus"
}

// SysBaseMenuBtn 菜单按钮
type SysBaseMenuBtn struct {
	ID            uint   `json:"ID" gorm:"primarykey"`
	SysBaseMenuID uint   `json:"sysBaseMenuID" gorm:"comment:菜单ID"`
	Name          string `json:"name" gorm:"comment:按钮关键key"`
	Desc          string `json:"desc" gorm:"comment:按钮备注"`
}

func (SysBaseMenuBtn) TableName() string {
	return "sys_base_menu_btns"
}

// SysBaseMenuParameter 菜单参数
type SysBaseMenuParameter struct {
	ID            uint   `json:"ID" gorm:"primarykey"`
	SysBaseMenuID uint   `json:"sysBaseMenuID" gorm:"comment:菜单ID"`
	Type          string `json:"type" gorm:"comment:地址栏携带参数为params还是query"`
	Key           string `json:"key" gorm:"comment:地址栏携带参数的key"`
	Value         string `json:"value" gorm:"comment:地址栏携带参数的值"`
}

func (SysBaseMenuParameter) TableName() string {
	return "sys_base_menu_parameters"
}

// Ast AST接口定义
type Ast interface {
	Parse(filename string, writer io.Writer) (file *ast.File, err error)
	Rollback(file *ast.File) error
	Injection(file *ast.File) error
	Format(filename string, writer io.Writer, file *ast.File) error
}

// AutoCodeHistoryRepo 扩展接口（添加Create方法）
type AutoCodeHistoryRepoExt interface {
	AutoCodeHistoryRepo
	Create(ctx context.Context, history *SysAutoCodeHistory) error
}

// AutoCodePackageRepoExt 扩展接口
// 注意：Templates方法已在AutoCodePackageRepo中定义，此处不再重复
type AutoCodePackageRepoExt interface {
	AutoCodePackageRepo
}
