package diff

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

	"github.com/go-errors/errors"
	pgschema "github.com/stripe/pg-schema-diff/pkg/diff"
)

func DiffPgSchema(ctx context.Context, source, target string, schema []string) (string, error) {
	dbSrc, err := sql.Open("pgx", source)
	if err != nil {
		return "", errors.Errorf("failed to open source database: %w", err)
	}
	defer dbSrc.Close()
	dbDst, err := sql.Open("pgx", target)
	if err != nil {
		return "", errors.Errorf("failed to open target database: %w", err)
	}
	defer dbDst.Close()
	// Generate DDL based on schema plan
	plan, err := pgschema.Generate(
		ctx,
		dbSrc,
		pgschema.DBSchemaSource(dbDst),
		pgschema.WithDoNotValidatePlan(),
		pgschema.WithIncludeSchemas(schema...),
	)
	if err != nil {
		return "", errors.Errorf("failed to generate plan: %w", err)
	}
	var lines []string
	for _, stat := range plan.Statements {
		for _, harzard := range stat.Hazards {
			lines = append(lines, fmt.Sprintf("-- %s", harzard))
		}
		lines = append(lines, fmt.Sprintf("%s;\n", stat.DDL))
	}
	return fmt.Sprintln(strings.Join(lines, "\n")), nil
}
