// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.

package query

import (
	"context"
	"database/sql"

	"gorm.io/gorm"
	"gorm.io/gorm/clause"
	"gorm.io/gorm/schema"

	"gorm.io/gen"
	"gorm.io/gen/field"

	"gorm.io/plugin/dbresolver"

	"stream.api/internal/database/model"
)

func newWalletTransaction(db *gorm.DB, opts ...gen.DOOption) walletTransaction {
	_walletTransaction := walletTransaction{}

	_walletTransaction.walletTransactionDo.UseDB(db, opts...)
	_walletTransaction.walletTransactionDo.UseModel(&model.WalletTransaction{})

	tableName := _walletTransaction.walletTransactionDo.TableName()
	_walletTransaction.ALL = field.NewAsterisk(tableName)
	_walletTransaction.ID = field.NewString(tableName, "id")
	_walletTransaction.UserID = field.NewString(tableName, "user_id")
	_walletTransaction.Type = field.NewString(tableName, "type")
	_walletTransaction.Amount = field.NewFloat64(tableName, "amount")
	_walletTransaction.Currency = field.NewString(tableName, "currency")
	_walletTransaction.Note = field.NewString(tableName, "note")
	_walletTransaction.CreatedAt = field.NewTime(tableName, "created_at")
	_walletTransaction.UpdatedAt = field.NewTime(tableName, "updated_at")
	_walletTransaction.PaymentID = field.NewString(tableName, "payment_id")
	_walletTransaction.PlanID = field.NewString(tableName, "plan_id")
	_walletTransaction.TermMonths = field.NewInt32(tableName, "term_months")
	_walletTransaction.Version = field.NewInt64(tableName, "version")

	_walletTransaction.fillFieldMap()

	return _walletTransaction
}

type walletTransaction struct {
	walletTransactionDo walletTransactionDo

	ALL        field.Asterisk
	ID         field.String
	UserID     field.String
	Type       field.String
	Amount     field.Float64
	Currency   field.String
	Note       field.String
	CreatedAt  field.Time
	UpdatedAt  field.Time
	PaymentID  field.String
	PlanID     field.String
	TermMonths field.Int32
	Version    field.Int64

	fieldMap map[string]field.Expr
}

func (w walletTransaction) Table(newTableName string) *walletTransaction {
	w.walletTransactionDo.UseTable(newTableName)
	return w.updateTableName(newTableName)
}

func (w walletTransaction) As(alias string) *walletTransaction {
	w.walletTransactionDo.DO = *(w.walletTransactionDo.As(alias).(*gen.DO))
	return w.updateTableName(alias)
}

func (w *walletTransaction) updateTableName(table string) *walletTransaction {
	w.ALL = field.NewAsterisk(table)
	w.ID = field.NewString(table, "id")
	w.UserID = field.NewString(table, "user_id")
	w.Type = field.NewString(table, "type")
	w.Amount = field.NewFloat64(table, "amount")
	w.Currency = field.NewString(table, "currency")
	w.Note = field.NewString(table, "note")
	w.CreatedAt = field.NewTime(table, "created_at")
	w.UpdatedAt = field.NewTime(table, "updated_at")
	w.PaymentID = field.NewString(table, "payment_id")
	w.PlanID = field.NewString(table, "plan_id")
	w.TermMonths = field.NewInt32(table, "term_months")
	w.Version = field.NewInt64(table, "version")

	w.fillFieldMap()

	return w
}

func (w *walletTransaction) WithContext(ctx context.Context) IWalletTransactionDo {
	return w.walletTransactionDo.WithContext(ctx)
}

func (w walletTransaction) TableName() string { return w.walletTransactionDo.TableName() }

func (w walletTransaction) Alias() string { return w.walletTransactionDo.Alias() }

func (w walletTransaction) Columns(cols ...field.Expr) gen.Columns {
	return w.walletTransactionDo.Columns(cols...)
}

func (w *walletTransaction) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
	_f, ok := w.fieldMap[fieldName]
	if !ok || _f == nil {
		return nil, false
	}
	_oe, ok := _f.(field.OrderExpr)
	return _oe, ok
}

func (w *walletTransaction) fillFieldMap() {
	w.fieldMap = make(map[string]field.Expr, 12)
	w.fieldMap["id"] = w.ID
	w.fieldMap["user_id"] = w.UserID
	w.fieldMap["type"] = w.Type
	w.fieldMap["amount"] = w.Amount
	w.fieldMap["currency"] = w.Currency
	w.fieldMap["note"] = w.Note
	w.fieldMap["created_at"] = w.CreatedAt
	w.fieldMap["updated_at"] = w.UpdatedAt
	w.fieldMap["payment_id"] = w.PaymentID
	w.fieldMap["plan_id"] = w.PlanID
	w.fieldMap["term_months"] = w.TermMonths
	w.fieldMap["version"] = w.Version
}

func (w walletTransaction) clone(db *gorm.DB) walletTransaction {
	w.walletTransactionDo.ReplaceConnPool(db.Statement.ConnPool)
	return w
}

func (w walletTransaction) replaceDB(db *gorm.DB) walletTransaction {
	w.walletTransactionDo.ReplaceDB(db)
	return w
}

type walletTransactionDo struct{ gen.DO }

type IWalletTransactionDo interface {
	gen.SubQuery
	Debug() IWalletTransactionDo
	WithContext(ctx context.Context) IWalletTransactionDo
	WithResult(fc func(tx gen.Dao)) gen.ResultInfo
	ReplaceDB(db *gorm.DB)
	ReadDB() IWalletTransactionDo
	WriteDB() IWalletTransactionDo
	As(alias string) gen.Dao
	Session(config *gorm.Session) IWalletTransactionDo
	Columns(cols ...field.Expr) gen.Columns
	Clauses(conds ...clause.Expression) IWalletTransactionDo
	Not(conds ...gen.Condition) IWalletTransactionDo
	Or(conds ...gen.Condition) IWalletTransactionDo
	Select(conds ...field.Expr) IWalletTransactionDo
	Where(conds ...gen.Condition) IWalletTransactionDo
	Order(conds ...field.Expr) IWalletTransactionDo
	Distinct(cols ...field.Expr) IWalletTransactionDo
	Omit(cols ...field.Expr) IWalletTransactionDo
	Join(table schema.Tabler, on ...field.Expr) IWalletTransactionDo
	LeftJoin(table schema.Tabler, on ...field.Expr) IWalletTransactionDo
	RightJoin(table schema.Tabler, on ...field.Expr) IWalletTransactionDo
	Group(cols ...field.Expr) IWalletTransactionDo
	Having(conds ...gen.Condition) IWalletTransactionDo
	Limit(limit int) IWalletTransactionDo
	Offset(offset int) IWalletTransactionDo
	Count() (count int64, err error)
	Scopes(funcs ...func(gen.Dao) gen.Dao) IWalletTransactionDo
	Unscoped() IWalletTransactionDo
	Create(values ...*model.WalletTransaction) error
	CreateInBatches(values []*model.WalletTransaction, batchSize int) error
	Save(values ...*model.WalletTransaction) error
	First() (*model.WalletTransaction, error)
	Take() (*model.WalletTransaction, error)
	Last() (*model.WalletTransaction, error)
	Find() ([]*model.WalletTransaction, error)
	FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.WalletTransaction, err error)
	FindInBatches(result *[]*model.WalletTransaction, batchSize int, fc func(tx gen.Dao, batch int) error) error
	Pluck(column field.Expr, dest interface{}) error
	Delete(...*model.WalletTransaction) (info gen.ResultInfo, err error)
	Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
	UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
	Updates(value interface{}) (info gen.ResultInfo, err error)
	UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
	UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
	UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
	UpdateFrom(q gen.SubQuery) gen.Dao
	Attrs(attrs ...field.AssignExpr) IWalletTransactionDo
	Assign(attrs ...field.AssignExpr) IWalletTransactionDo
	Joins(fields ...field.RelationField) IWalletTransactionDo
	Preload(fields ...field.RelationField) IWalletTransactionDo
	FirstOrInit() (*model.WalletTransaction, error)
	FirstOrCreate() (*model.WalletTransaction, error)
	FindByPage(offset int, limit int) (result []*model.WalletTransaction, count int64, err error)
	ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
	Rows() (*sql.Rows, error)
	Row() *sql.Row
	Scan(result interface{}) (err error)
	Returning(value interface{}, columns ...string) IWalletTransactionDo
	UnderlyingDB() *gorm.DB
	schema.Tabler
}

func (w walletTransactionDo) Debug() IWalletTransactionDo {
	return w.withDO(w.DO.Debug())
}

func (w walletTransactionDo) WithContext(ctx context.Context) IWalletTransactionDo {
	return w.withDO(w.DO.WithContext(ctx))
}

func (w walletTransactionDo) ReadDB() IWalletTransactionDo {
	return w.Clauses(dbresolver.Read)
}

func (w walletTransactionDo) WriteDB() IWalletTransactionDo {
	return w.Clauses(dbresolver.Write)
}

func (w walletTransactionDo) Session(config *gorm.Session) IWalletTransactionDo {
	return w.withDO(w.DO.Session(config))
}

func (w walletTransactionDo) Clauses(conds ...clause.Expression) IWalletTransactionDo {
	return w.withDO(w.DO.Clauses(conds...))
}

func (w walletTransactionDo) Returning(value interface{}, columns ...string) IWalletTransactionDo {
	return w.withDO(w.DO.Returning(value, columns...))
}

func (w walletTransactionDo) Not(conds ...gen.Condition) IWalletTransactionDo {
	return w.withDO(w.DO.Not(conds...))
}

func (w walletTransactionDo) Or(conds ...gen.Condition) IWalletTransactionDo {
	return w.withDO(w.DO.Or(conds...))
}

func (w walletTransactionDo) Select(conds ...field.Expr) IWalletTransactionDo {
	return w.withDO(w.DO.Select(conds...))
}

func (w walletTransactionDo) Where(conds ...gen.Condition) IWalletTransactionDo {
	return w.withDO(w.DO.Where(conds...))
}

func (w walletTransactionDo) Order(conds ...field.Expr) IWalletTransactionDo {
	return w.withDO(w.DO.Order(conds...))
}

func (w walletTransactionDo) Distinct(cols ...field.Expr) IWalletTransactionDo {
	return w.withDO(w.DO.Distinct(cols...))
}

func (w walletTransactionDo) Omit(cols ...field.Expr) IWalletTransactionDo {
	return w.withDO(w.DO.Omit(cols...))
}

func (w walletTransactionDo) Join(table schema.Tabler, on ...field.Expr) IWalletTransactionDo {
	return w.withDO(w.DO.Join(table, on...))
}

func (w walletTransactionDo) LeftJoin(table schema.Tabler, on ...field.Expr) IWalletTransactionDo {
	return w.withDO(w.DO.LeftJoin(table, on...))
}

func (w walletTransactionDo) RightJoin(table schema.Tabler, on ...field.Expr) IWalletTransactionDo {
	return w.withDO(w.DO.RightJoin(table, on...))
}

func (w walletTransactionDo) Group(cols ...field.Expr) IWalletTransactionDo {
	return w.withDO(w.DO.Group(cols...))
}

func (w walletTransactionDo) Having(conds ...gen.Condition) IWalletTransactionDo {
	return w.withDO(w.DO.Having(conds...))
}

func (w walletTransactionDo) Limit(limit int) IWalletTransactionDo {
	return w.withDO(w.DO.Limit(limit))
}

func (w walletTransactionDo) Offset(offset int) IWalletTransactionDo {
	return w.withDO(w.DO.Offset(offset))
}

func (w walletTransactionDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IWalletTransactionDo {
	return w.withDO(w.DO.Scopes(funcs...))
}

func (w walletTransactionDo) Unscoped() IWalletTransactionDo {
	return w.withDO(w.DO.Unscoped())
}

func (w walletTransactionDo) Create(values ...*model.WalletTransaction) error {
	if len(values) == 0 {
		return nil
	}
	return w.DO.Create(values)
}

func (w walletTransactionDo) CreateInBatches(values []*model.WalletTransaction, batchSize int) error {
	return w.DO.CreateInBatches(values, batchSize)
}

// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (w walletTransactionDo) Save(values ...*model.WalletTransaction) error {
	if len(values) == 0 {
		return nil
	}
	return w.DO.Save(values)
}

func (w walletTransactionDo) First() (*model.WalletTransaction, error) {
	if result, err := w.DO.First(); err != nil {
		return nil, err
	} else {
		return result.(*model.WalletTransaction), nil
	}
}

func (w walletTransactionDo) Take() (*model.WalletTransaction, error) {
	if result, err := w.DO.Take(); err != nil {
		return nil, err
	} else {
		return result.(*model.WalletTransaction), nil
	}
}

func (w walletTransactionDo) Last() (*model.WalletTransaction, error) {
	if result, err := w.DO.Last(); err != nil {
		return nil, err
	} else {
		return result.(*model.WalletTransaction), nil
	}
}

func (w walletTransactionDo) Find() ([]*model.WalletTransaction, error) {
	result, err := w.DO.Find()
	return result.([]*model.WalletTransaction), err
}

func (w walletTransactionDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.WalletTransaction, err error) {
	buf := make([]*model.WalletTransaction, 0, batchSize)
	err = w.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
		defer func() { results = append(results, buf...) }()
		return fc(tx, batch)
	})
	return results, err
}

func (w walletTransactionDo) FindInBatches(result *[]*model.WalletTransaction, batchSize int, fc func(tx gen.Dao, batch int) error) error {
	return w.DO.FindInBatches(result, batchSize, fc)
}

func (w walletTransactionDo) Attrs(attrs ...field.AssignExpr) IWalletTransactionDo {
	return w.withDO(w.DO.Attrs(attrs...))
}

func (w walletTransactionDo) Assign(attrs ...field.AssignExpr) IWalletTransactionDo {
	return w.withDO(w.DO.Assign(attrs...))
}

func (w walletTransactionDo) Joins(fields ...field.RelationField) IWalletTransactionDo {
	for _, _f := range fields {
		w = *w.withDO(w.DO.Joins(_f))
	}
	return &w
}

func (w walletTransactionDo) Preload(fields ...field.RelationField) IWalletTransactionDo {
	for _, _f := range fields {
		w = *w.withDO(w.DO.Preload(_f))
	}
	return &w
}

func (w walletTransactionDo) FirstOrInit() (*model.WalletTransaction, error) {
	if result, err := w.DO.FirstOrInit(); err != nil {
		return nil, err
	} else {
		return result.(*model.WalletTransaction), nil
	}
}

func (w walletTransactionDo) FirstOrCreate() (*model.WalletTransaction, error) {
	if result, err := w.DO.FirstOrCreate(); err != nil {
		return nil, err
	} else {
		return result.(*model.WalletTransaction), nil
	}
}

func (w walletTransactionDo) FindByPage(offset int, limit int) (result []*model.WalletTransaction, count int64, err error) {
	result, err = w.Offset(offset).Limit(limit).Find()
	if err != nil {
		return
	}

	if size := len(result); 0 < limit && 0 < size && size < limit {
		count = int64(size + offset)
		return
	}

	count, err = w.Offset(-1).Limit(-1).Count()
	return
}

func (w walletTransactionDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
	count, err = w.Count()
	if err != nil {
		return
	}

	err = w.Offset(offset).Limit(limit).Scan(result)
	return
}

func (w walletTransactionDo) Scan(result interface{}) (err error) {
	return w.DO.Scan(result)
}

func (w walletTransactionDo) Delete(models ...*model.WalletTransaction) (result gen.ResultInfo, err error) {
	return w.DO.Delete(models)
}

func (w *walletTransactionDo) withDO(do gen.Dao) *walletTransactionDo {
	w.DO = *do.(*gen.DO)
	return w
}
