// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.

package gdb

// Schema is a schema object from which it can then create a Model.
type Schema struct {
	db     DB
	tx     *TX
	schema string
}

// Schema creates and returns a schema.
func (c *Core) Schema(schema string) *Schema {
	return &Schema{
		db:     c.db,
		schema: schema,
	}
}

// Schema creates and returns a initialization model from schema,
// from which it can then create a Model.
func (tx *TX) Schema(schema string) *Schema {
	return &Schema{
		tx:     tx,
		schema: schema,
	}
}

// Table creates and returns a new ORM model.
// The parameter `tables` can be more than one table names, like :
// "user", "user u", "user, user_detail", "user u, user_detail ud"
func (s *Schema) Table(table string) *Model {
	var m *Model
	if s.tx != nil {
		m = s.tx.Model(table)
	} else {
		m = s.db.Model(table)
	}
	// Do not change the schema of the original db,
	// it here creates a new db and changes its schema.
	db, err := New(m.db.GetGroup())
	if err != nil {
		panic(err)
	}
	db.SetSchema(s.schema)
	m.db = db
	m.schema = s.schema
	return m
}

// Model is alias of Core.Table.
// See Core.Table.
func (s *Schema) Model(table string) *Model {
	return s.Table(table)
}
