package mysql

import (
	"context"
	"database/sql"
	"strings"

	_ "github.com/go-sql-driver/mysql"
	"hyapp/pkg/xerr"
)

// Store 持有 notice-service 自己的 MySQL 连接池。
// 业务模块通过 DB 共享同一个连接池，但不能绕过各自模块仓储直接写状态。
type Store struct {
	DB *sql.DB
}

// Open 创建 notice-service 基础连接池，并在启动期完成一次 ping。
func Open(ctx context.Context, dsn string) (*Store, error) {
	if strings.TrimSpace(dsn) == "" {
		return nil, xerr.New(xerr.InvalidArgument, "mysql_dsn is required")
	}
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		return nil, err
	}
	if err := db.PingContext(ctx); err != nil {
		_ = db.Close()
		return nil, err
	}
	return &Store{DB: db}, nil
}

// Ping 给 gRPC health 和 HTTP health 复用，不混入具体业务表检查。
func (s *Store) Ping(ctx context.Context) error {
	if s == nil || s.DB == nil {
		return xerr.New(xerr.Unavailable, "mysql store is not configured")
	}
	return s.DB.PingContext(ctx)
}

// Close 释放连接池；业务 worker 必须在调用前完成 drain。
func (s *Store) Close() error {
	if s == nil || s.DB == nil {
		return nil
	}
	return s.DB.Close()
}
