package schema

import (
	"context"
	"log"
	"time"

	"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext"
	"github.com/geeks-accelerator/sqlxmigrate"
	"github.com/jmoiron/sqlx"
)

// Migrate is the entry point for performing init schema and running all the migrations.
func Migrate(ctx context.Context, targetEnv webcontext.Env, masterDb *sqlx.DB, log *log.Logger, isUnittest bool) error {

	// Set the context with the required values to
	// process the request.
	v := webcontext.Values{
		Now: time.Now(),
		Env: targetEnv,
	}
	ctx = context.WithValue(ctx, webcontext.KeyValues, &v)

	// Load list of Schema migrations and init new sqlxmigrate client
	migrations := migrationList(ctx, masterDb, log, isUnittest)
	m := sqlxmigrate.New(masterDb, sqlxmigrate.DefaultOptions, migrations)
	m.SetLogger(log)

	// Append any schema that need to be applied if this is a fresh migration
	// ie. the migrations database table does not exist.
	m.InitSchema(initSchema(ctx, masterDb, log, isUnittest))

	// Execute the migrations
	return m.Migrate()
}