package service

import (
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
	"gorm.io/gorm/schema"
)

var failClosedDB = newFailClosedDB()

// failClosedDialector gives GORM a complete statement/callback graph without
// installing a connection pool. Queries always carry a pre-existing tenant
// resolution error, so callbacks cannot execute SQL.
type failClosedDialector struct{}

func (failClosedDialector) Name() string { return "tenant-fail-closed" }

func (failClosedDialector) Initialize(*gorm.DB) error { return nil }

func (failClosedDialector) Migrator(*gorm.DB) gorm.Migrator { return nil }

func (failClosedDialector) DataTypeOf(*schema.Field) string { return "" }

func (failClosedDialector) DefaultValueOf(*schema.Field) clause.Expression { return nil }

func (failClosedDialector) BindVarTo(writer clause.Writer, _ *gorm.Statement, _ any) {
	_ = writer.WriteByte('?')
}

func (failClosedDialector) QuoteTo(writer clause.Writer, value string) {
	_, _ = writer.WriteString(value)
}

func (failClosedDialector) Explain(sql string, _ ...any) string { return sql }

func newFailClosedDB() *gorm.DB {
	database, err := gorm.Open(failClosedDialector{}, &gorm.Config{
		DisableAutomaticPing: true,
	})
	if err != nil {
		panic("initialize tenant fail-closed database: " + err.Error())
	}
	return database
}
