// Package core 提供核心应用协调功能
// 负责初始化和协调API、任务执行器和存储等核心组件
// 管理整个应用的生命周期
package core

import (
	"fmt"

	"git.huangwc.com/pig/pig-farm-controller/internal/api"
	"git.huangwc.com/pig/pig-farm-controller/internal/config"
	"git.huangwc.com/pig/pig-farm-controller/internal/logs"
	"git.huangwc.com/pig/pig-farm-controller/internal/service"
	"git.huangwc.com/pig/pig-farm-controller/internal/storage/db"
	"git.huangwc.com/pig/pig-farm-controller/internal/storage/repository"
	"git.huangwc.com/pig/pig-farm-controller/internal/task"
)

// Application 代表核心应用结构
// 协调API、任务执行器和存储组件的工作
type Application struct {
	// Storage 存储组件实例
	Storage db.Storage

	// API API组件实例
	API *api.API

	// TaskExecutor 任务执行器组件实例
	TaskExecutor *task.Executor

	// UserRepo 用户仓库实例
	UserRepo repository.UserRepo

	// OperationHistoryRepo 操作历史仓库实例
	OperationHistoryRepo repository.OperationHistoryRepo

	// DeviceControlRepo 设备控制仓库实例
	DeviceControlRepo repository.DeviceControlRepo

	// DeviceRepo 设备仓库实例
	DeviceRepo repository.DeviceRepo

	// WebSocketService WebSocket服务实例
	WebSocketService *service.WebSocketService

	// Config 应用配置
	Config *config.Config

	// logger 日志组件实例
	logger *logs.Logger
}

// NewApplication 创建并返回一个新的核心应用实例
// 初始化所有核心组件
func NewApplication(cfg *config.Config) *Application {
	// 从配置中获取数据库连接字符串
	connectionString := cfg.GetDatabaseConnectionString()

	// 从配置中获取连接池参数
	maxOpenConns := cfg.Database.MaxOpenConns
	maxIdleConns := cfg.Database.MaxIdleConns
	connMaxLifetime := cfg.Database.ConnMaxLifetime

	// 初始化存储组件
	store := db.NewStorage(connectionString, maxOpenConns, maxIdleConns, connMaxLifetime)

	// 初始化用户仓库
	userRepo := repository.NewUserRepo(store.GetDB())

	// 初始化操作历史仓库
	operationHistoryRepo := repository.NewOperationHistoryRepo(store.GetDB())

	// 初始化设备控制仓库
	deviceControlRepo := repository.NewDeviceControlRepo(store.GetDB())

	// 初始化设备仓库
	deviceRepo := repository.NewDeviceRepo(store.GetDB())

	// 初始化WebSocket服务
	websocketService := service.NewWebSocketService()

	// 初始化API组件
	apiInstance := api.NewAPI(cfg, userRepo, operationHistoryRepo, deviceControlRepo, deviceRepo, websocketService)

	// 初始化任务执行器组件(使用5个工作协程)
	taskExecutor := task.NewExecutor(5)

	return &Application{
		Storage:              store,
		API:                  apiInstance,
		TaskExecutor:         taskExecutor,
		UserRepo:             userRepo,
		OperationHistoryRepo: operationHistoryRepo,
		DeviceControlRepo:    deviceControlRepo,
		DeviceRepo:           deviceRepo,
		WebSocketService:     websocketService,
		Config:               cfg,
		logger:               logs.NewLogger(),
	}
}

// Start 启动核心应用
// 按正确顺序启动所有核心组件
func (app *Application) Start() error {
	// 启动存储组件
	if err := app.Storage.Connect(); err != nil {
		return fmt.Errorf("存储连接失败: %v", err)
	}
	app.logger.Info("存储连接成功")

	// 启动API组件
	if err := app.API.Start(); err != nil {
		return fmt.Errorf("API启动失败: %v", err)
	}
	app.logger.Info("API启动成功")

	// 启动任务执行器组件
	app.TaskExecutor.Start()
	app.logger.Info("任务执行器启动成功")

	return nil
}

// Stop 停止核心应用
// 按正确顺序停止所有核心组件
func (app *Application) Stop() error {
	// 停止API组件
	if err := app.API.Stop(); err != nil {
		app.logger.Error(fmt.Sprintf("API停止失败: %v", err))
	}

	// 停止任务执行器组件
	app.TaskExecutor.Stop()
	app.logger.Info("任务执行器已停止")

	// 停止存储组件
	if err := app.Storage.Disconnect(); err != nil {
		return fmt.Errorf("存储断开连接失败: %v", err)
	}
	app.logger.Info("存储断开连接成功")

	return nil
}
