// Package schema exposes the MeshX and embedded AGS schema-tool surface.
package schema

import (
	"context"
	"fmt"

	agsserver "github.com/pingcap/agent-git-service/server"

	"github.com/tidbcloud/AgentTeam/internal/config"
	"github.com/tidbcloud/AgentTeam/internal/database"
)

// ValidateConfigFromEnv validates the complete MeshX/AGS schema-tool
// configuration without opening databases or performing any other side effect.
func ValidateConfigFromEnv() error {
	_, err := config.LoadResourceRuntimeFromEnv()
	return err
}

// MigrateFromEnv applies AGS and MeshX schema migrations for one-shot tools.
func MigrateFromEnv(ctx context.Context) error {
	cfg, err := config.LoadResourceRuntimeFromEnv()
	if err != nil {
		return err
	}
	if err := agsserver.MigrateDatabase(cfg.AGS.DatabaseDSN, cfg.AGS.EmbeddingDimensions); err != nil {
		return fmt.Errorf("migrate AGS schema: %w", err)
	}
	db, err := database.OpenWithoutMigrate(database.Config{DSN: cfg.Database.DSN})
	if err != nil {
		return fmt.Errorf("open MeshX schema database: %w", err)
	}
	defer database.Close(db)
	if err := database.Migrate(db); err != nil {
		return err
	}
	return VerifyFromEnv(ctx)
}

// VerifyFromEnv checks AGS and MeshX schema compatibility without DDL.
func VerifyFromEnv(ctx context.Context) error {
	cfg, err := config.LoadResourceRuntimeFromEnv()
	if err != nil {
		return err
	}
	if err := agsserver.VerifyDatabaseSchema(ctx, cfg.AGS.DatabaseDSN); err != nil {
		return fmt.Errorf("verify AGS schema: %w", err)
	}
	db, err := database.OpenWithoutMigrate(database.Config{DSN: cfg.Database.DSN})
	if err != nil {
		return fmt.Errorf("open MeshX schema database: %w", err)
	}
	defer database.Close(db)
	if err := database.VerifySchema(db.WithContext(ctx)); err != nil {
		return fmt.Errorf("verify MeshX schema: %w", err)
	}
	return nil
}
