package system

import (
	"context"
	"errors"
	"time"
)

var (
	ErrErrorNotFound = errors.New("错误日志不存在")
)

// SysError 错误日志实体
type SysError struct {
	ID        int64
	Form      string
	Info      string
	Level     string
	Solution  string
	Status    string
	CreatedAt time.Time
	UpdatedAt time.Time
}

// ErrorSearchReq 错误日志搜索请求
type ErrorSearchReq struct {
	Page           int
	PageSize       int
	Form           *string
	Info           *string
	CreatedAtRange []time.Time
}

// ErrorRepo 错误日志仓储接口
type ErrorRepo interface {
	Create(ctx context.Context, sysError *SysError) error
	Delete(ctx context.Context, id string) error
	DeleteByIds(ctx context.Context, ids []string) error
	Update(ctx context.Context, sysError *SysError) error
	GetById(ctx context.Context, id string) (*SysError, error)
	GetList(ctx context.Context, req *ErrorSearchReq) ([]*SysError, int64, error)
	UpdateStatus(ctx context.Context, id string, status string) error
	UpdateSolution(ctx context.Context, id string, status string, solution string) error
}

// ErrorUsecase 错误日志用例
type ErrorUsecase struct {
	repo ErrorRepo
}

// NewErrorUsecase 创建错误日志用例
func NewErrorUsecase(repo ErrorRepo) *ErrorUsecase {
	return &ErrorUsecase{repo: repo}
}

// CreateSysError 创建错误日志
func (uc *ErrorUsecase) CreateSysError(ctx context.Context, sysError *SysError) error {
	return uc.repo.Create(ctx, sysError)
}

// DeleteSysError 删除错误日志
func (uc *ErrorUsecase) DeleteSysError(ctx context.Context, id string) error {
	return uc.repo.Delete(ctx, id)
}

// DeleteSysErrorByIds 批量删除错误日志
func (uc *ErrorUsecase) DeleteSysErrorByIds(ctx context.Context, ids []string) error {
	return uc.repo.DeleteByIds(ctx, ids)
}

// UpdateSysError 更新错误日志
func (uc *ErrorUsecase) UpdateSysError(ctx context.Context, sysError *SysError) error {
	return uc.repo.Update(ctx, sysError)
}

// GetSysError 根据ID获取错误日志
func (uc *ErrorUsecase) GetSysError(ctx context.Context, id string) (*SysError, error) {
	return uc.repo.GetById(ctx, id)
}

// GetSysErrorInfoList 分页获取错误日志列表
func (uc *ErrorUsecase) GetSysErrorInfoList(ctx context.Context, req *ErrorSearchReq) ([]*SysError, int64, error) {
	return uc.repo.GetList(ctx, req)
}

// GetSysErrorSolution 异步处理错误（触发AI生成解决方案）
func (uc *ErrorUsecase) GetSysErrorSolution(ctx context.Context, id string) error {
	// 立即更新为处理中
	if err := uc.repo.UpdateStatus(ctx, id, "处理中"); err != nil {
		return err
	}

	// 异步处理（简化版本，不调用LLM）
	go func(errorId string) {
		// 这里可以集成AI服务生成解决方案
		// 目前简化为直接标记处理完成
		_ = uc.repo.UpdateStatus(context.Background(), errorId, "处理完成")
	}(id)

	return nil
}
