package controlplane

import (
	"context"
	"database/sql"

	"github.com/nexuscrm/metadata"
	"github.com/nexuscrm/persistence"
	"github.com/nexuscrm/shared/pkg/models"
	"github.com/pingcap-inc/nexuscrm-controlplane/packs"
)

func installedPackResolverOptionsWithSchema(ctx context.Context, db *sql.DB) packs.InstalledPackResolverOptions {
	return packs.InstalledPackResolverOptions{
		AllowBundledFallback: false,
		ObjectSchemaResolver: installedPackObjectSchemaResolver(ctx, db),
	}
}

func packSourceOptionsWithSchema(ctx context.Context, db *sql.DB) packs.PackSourceOptions {
	opts, ok := packs.OperationPackSourceOptions(ctx)
	if !ok {
		opts = packs.DefaultPackSourceOptions()
	}
	opts.ObjectSchemaResolver = installedPackObjectSchemaResolver(ctx, db)
	return opts
}

func packSourceOptionsForRequestedSourceValidation(opts packs.PackSourceOptions) packs.PackSourceOptions {
	opts.ObjectSchemaResolver = nil
	return opts
}

func installedPackObjectSchemaResolver(ctx context.Context, db *sql.DB) func(string) *models.ObjectMetadata {
	if db == nil {
		return nil
	}
	metadataRepo := persistence.NewMetadataRepository(db)
	schemaRepo := persistence.NewSchemaRepository(db, nil)
	metadataSvc := metadata.NewMetadataService(metadataRepo, metadata.NewSchemaManager(schemaRepo), nil)
	return func(apiName string) *models.ObjectMetadata {
		return metadataSvc.GetSchema(ctx, apiName)
	}
}
