package sqlmigration

import (
	"context"
	"time"

	"github.com/SigNoz/signoz/pkg/factory"
	"github.com/uptrace/bun"
	"github.com/uptrace/bun/migrate"
)

type addLicenses struct{}

func NewAddLicensesFactory() factory.ProviderFactory[SQLMigration, Config] {
	return factory.NewProviderFactory(factory.MustNewName("add_licenses"), newAddLicenses)
}

func newAddLicenses(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
	return &addLicenses{}, nil
}

func (migration *addLicenses) Register(migrations *migrate.Migrations) error {
	if err := migrations.Register(migration.Up, migration.Down); err != nil {
		return err
	}

	return nil
}

func (migration *addLicenses) Up(ctx context.Context, db *bun.DB) error {
	if _, err := db.NewCreateTable().
		Model(&struct {
			bun.BaseModel     `bun:"table:licenses"`
			Key               string    `bun:"key,pk,type:text"`
			CreatedAt         time.Time `bun:"createdAt,default:current_timestamp"`
			UpdatedAt         time.Time `bun:"updatedAt,default:current_timestamp"`
			PlanDetails       string    `bun:"planDetails,type:text"`
			ActivationID      string    `bun:"activationId,type:text"`
			ValidationMessage string    `bun:"validationMessage,type:text"`
			LastValidated     time.Time `bun:"lastValidated,default:current_timestamp"`
		}{}).
		IfNotExists().
		Exec(ctx); err != nil {
		return err
	}

	if _, err := db.NewCreateTable().
		Model(&struct {
			bun.BaseModel `bun:"table:sites"`

			UUID      string    `bun:"uuid,pk,type:text"`
			Alias     string    `bun:"alias,type:varchar(180),default:'PROD'"`
			URL       string    `bun:"url,type:varchar(300)"`
			CreatedAt time.Time `bun:"createdAt,default:current_timestamp"`
		}{}).
		IfNotExists().
		Exec(ctx); err != nil {
		return err
	}

	if _, err := db.NewCreateTable().
		Model(&struct {
			bun.BaseModel `bun:"table:feature_status"`
			Name          string `bun:"name,pk,type:text"`
			Active        bool   `bun:"active"`
			Usage         int    `bun:"usage,default:0"`
			UsageLimit    int    `bun:"usage_limit,default:0"`
			Route         string `bun:"route,type:text"`
		}{}).
		IfNotExists().
		Exec(ctx); err != nil {
		return err
	}

	if _, err := db.NewCreateTable().
		Model(&struct {
			bun.BaseModel `bun:"table:licenses_v3"`
			ID            string `bun:"id,pk,type:text"`
			Key           string `bun:"key,type:text,notnull,unique"`
			Data          string `bun:"data,type:text"`
		}{}).
		IfNotExists().
		Exec(ctx); err != nil {
		return err
	}

	return nil
}

func (migration *addLicenses) Down(ctx context.Context, db *bun.DB) error {
	return nil
}
