// Package database 提供统一的数据存储接口
// 定义存储接口规范，支持多种存储后端实现
// 当前支持PostgreSQL实现
package database

import (
	"context"
	"fmt"

	"git.huangwc.com/pig/pig-farm-controller/internal/infra/config"
	"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"

	"gorm.io/gorm"
)

// Storage 代表统一的存储接口
// 所有存储实现都需要实现此接口定义的方法
type Storage interface {
	// Connect 建立与存储后端的连接
	Connect(ctx context.Context) error

	// Disconnect 断开与存储后端的连接
	Disconnect(ctx context.Context) error

	// GetDB 获取数据库实例
	GetDB(ctx context.Context) *gorm.DB

	// Migrate 执行数据库迁移
	// 参数为需要迁移的 GORM 模型
	Migrate(ctx context.Context, models ...interface{}) error
}

// NewStorage 创建并返回一个存储实例
// 根据配置返回相应的存储实现
func NewStorage(ctx context.Context, cfg config.DatabaseConfig) Storage {
	// 构建数据库连接字符串
	connectionString := fmt.Sprintf(
		"user=%s password=%s dbname=%s host=%s port=%d sslmode=%s",
		cfg.Username,
		cfg.Password,
		cfg.DBName,
		cfg.Host,
		cfg.Port,
		cfg.SSLMode,
	)

	// 当前默认返回PostgreSQL存储实现，并将 logger 注入
	// 当前默认返回PostgreSQL存储实现，并将 logger 注入
	return NewPostgresStorage(
		logs.AddCompName(context.Background(), "PostgresStorage"),
		connectionString,
		cfg.IsTimescaleDB,
		cfg.MaxOpenConns,
		cfg.MaxIdleConns,
		cfg.ConnMaxLifetime,
	)
}
