package system

import (
	"context"
)

// SysAutoCodePackage 代码包实体
type SysAutoCodePackage struct {
	ID          uint
	Desc        string
	Label       string
	Template    string
	PackageName string
	Module      string
}

// TemplateDirMapping 模板目录映射配置
// 用于定义模板目录到输出目录的映射关系
type TemplateDirMapping struct {
	// TemplateDir 模板目录名（相对于 resource/{template}/server 或 resource/{template}/web）
	TemplateDir string
	// TargetDir 目标目录（相对于项目根目录）
	TargetDir string
	// Description 描述
	Description string
}

// KratosDDDServerMappings Kratos DDD 架构服务端目录映射
// 定义模板目录到输出目录的映射关系
// 注意：实际输出路径会在 {TargetDir}/{package}/ 下，文件名根据模板类型确定
var KratosDDDServerMappings = []TemplateDirMapping{
	{TemplateDir: "biz", TargetDir: "internal/biz/{package}", Description: "Biz 层: Usecase + Repository 接口"},
	{TemplateDir: "data", TargetDir: "internal/data/{package}", Description: "Data 层: Repository 实现"},
	{TemplateDir: "handler", TargetDir: "internal/server/handler/{package}", Description: "Handler 层: HTTP Handler"},
	{TemplateDir: "api", TargetDir: "internal/server/handler/{package}", Description: "API 层 (兼容旧模板)"},
	{TemplateDir: "service", TargetDir: "internal/service/{package}", Description: "Service 层: 服务实现"},
	{TemplateDir: "router", TargetDir: "internal/server/router/{package}", Description: "Router 层: 路由配置"},
	{TemplateDir: "types", TargetDir: "internal/service/types/{package}/request", Description: "Types 层: 请求/响应类型"},
	{TemplateDir: "model", TargetDir: "internal/data/model/{package}", Description: "Model 层: GORM Gen 模型"},
	{TemplateDir: "model/request", TargetDir: "internal/service/types/{package}/request", Description: "Model Request 层: 请求类型 (兼容旧模板)"},
}

// KratosDDDWebMappings Kratos DDD 架构前端目录映射
// 定义模板目录到输出目录的映射关系
// 注意：pages 输出到 {TargetDir}/{package}/{entity}/，services 输出到 {TargetDir}/
var KratosDDDWebMappings = []TemplateDirMapping{
	{TemplateDir: "pages", TargetDir: "web/src/pages/{package}/{entity}", Description: "React 页面组件"},
	{TemplateDir: "services", TargetDir: "web/src/services/kratos", Description: "API 服务"},
	{TemplateDir: "types", TargetDir: "web/src/types/{package}", Description: "TypeScript 类型定义"},
	{TemplateDir: "api", TargetDir: "web/src/services/kratos", Description: "API 服务 (兼容旧模板)"},
	{TemplateDir: "view", TargetDir: "web/src/pages/{package}/{entity}", Description: "Vue 页面 (兼容旧模板)"},
}

// AutoCodePackageRepo 代码包仓储接口
type AutoCodePackageRepo interface {
	Create(ctx context.Context, pkg *SysAutoCodePackage) error
	Delete(ctx context.Context, id uint) error
	DeleteByNames(ctx context.Context, names []string) error
	All(ctx context.Context) ([]SysAutoCodePackage, error)
	First(ctx context.Context, packageName, template string) (*SysAutoCodePackage, error)
	FindByPackageName(ctx context.Context, packageName string) (*SysAutoCodePackage, error)
	BatchCreate(ctx context.Context, pkgs []SysAutoCodePackage) error
	DeleteByIDs(ctx context.Context, ids []uint) error
	Templates(ctx context.Context, entity *SysAutoCodePackage, info interface{}, isPackage bool) (map[string]string, map[string]Ast, map[string]string, error)
}

// AutoCodePackageUsecase 代码包用例
type AutoCodePackageUsecase struct {
	repo AutoCodePackageRepo
}

// NewAutoCodePackageUsecase 创建代码包用例
func NewAutoCodePackageUsecase(repo AutoCodePackageRepo) *AutoCodePackageUsecase {
	return &AutoCodePackageUsecase{repo: repo}
}

// Create 创建包
func (uc *AutoCodePackageUsecase) Create(ctx context.Context, pkg *SysAutoCodePackage) error {
	return uc.repo.Create(ctx, pkg)
}

// Delete 删除包
func (uc *AutoCodePackageUsecase) Delete(ctx context.Context, id uint) error {
	return uc.repo.Delete(ctx, id)
}

// DeleteByNames 根据名称删除包
func (uc *AutoCodePackageUsecase) DeleteByNames(ctx context.Context, names []string) error {
	return uc.repo.DeleteByNames(ctx, names)
}

// All 获取所有包
func (uc *AutoCodePackageUsecase) All(ctx context.Context) ([]SysAutoCodePackage, error) {
	return uc.repo.All(ctx)
}

// First 查询包
func (uc *AutoCodePackageUsecase) First(ctx context.Context, packageName, template string) (*SysAutoCodePackage, error) {
	return uc.repo.First(ctx, packageName, template)
}

// FindByPackageName 根据包名查询
func (uc *AutoCodePackageUsecase) FindByPackageName(ctx context.Context, packageName string) (*SysAutoCodePackage, error) {
	return uc.repo.FindByPackageName(ctx, packageName)
}

// BatchCreate 批量创建
func (uc *AutoCodePackageUsecase) BatchCreate(ctx context.Context, pkgs []SysAutoCodePackage) error {
	return uc.repo.BatchCreate(ctx, pkgs)
}

// DeleteByIDs 根据ID批量删除
func (uc *AutoCodePackageUsecase) DeleteByIDs(ctx context.Context, ids []uint) error {
	return uc.repo.DeleteByIDs(ctx, ids)
}

// Templates 获取模板
func (uc *AutoCodePackageUsecase) Templates(ctx context.Context, entity *SysAutoCodePackage, info interface{}, isPackage bool) (map[string]string, map[string]Ast, map[string]string, error) {
	return uc.repo.Templates(ctx, entity, info, isPackage)
}

// GetTemplateNames 获取所有模版文件夹名称
func (uc *AutoCodePackageUsecase) GetTemplateNames(ctx context.Context) ([]string, error) {
	// 返回固定的模版列表
	return []string{"package", "plugin"}, nil
}

// GetServerMappings 获取服务端目录映射
func (uc *AutoCodePackageUsecase) GetServerMappings() []TemplateDirMapping {
	return KratosDDDServerMappings
}

// GetWebMappings 获取前端目录映射
func (uc *AutoCodePackageUsecase) GetWebMappings() []TemplateDirMapping {
	return KratosDDDWebMappings
}
