// ==========================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// ==========================================================================

package internal

import (
	"context"

	"github.com/gogf/gf/v2/database/gdb"
	"github.com/gogf/gf/v2/frame/g"
)

// BooksDao is the data access object for the table books.
type BooksDao struct {
	table    string             // table is the underlying table name of the DAO.
	group    string             // group is the database configuration group name of the current DAO.
	columns  BooksColumns       // columns contains all the column names of Table for convenient usage.
	handlers []gdb.ModelHandler // handlers for customized model modification.
}

// BooksColumns defines and stores column names for the table books.
type BooksColumns struct {
	Id             string // 小说ID
	AuthorId       string // 作者ID
	CategoryId     string // 分类ID
	Title          string // 小说标题
	CoverUrl       string // 封面图片URL
	Description    string // 小说简介
	Status         string // 状态：1=连载中，2=完结，3=下架
	WordsCount     string // 字数
	ChaptersCount  string // 章节数
	Rating         string // 评分（0.00~10.00）
	ReadCount      string // 阅读人数
	CurrentReaders string // 在读人数
	Tags           string // 标签（逗号分隔）
	CreatedAt      string // 创建时间
	UpdatedAt      string // 更新时间
	DeletedAt      string // 软删除时间戳
	IsRecommended  string // 是否推荐：0=否，1=是
	IsFeatured     string // 是否精选：0=否，1=是
	IsHot          string // 是否热门：0=否，1=是
	Language       string // 语言，如 zh=中文，en=英文，jp=日文
}

// booksColumns holds the columns for the table books.
var booksColumns = BooksColumns{
	Id:             "id",
	AuthorId:       "author_id",
	CategoryId:     "category_id",
	Title:          "title",
	CoverUrl:       "cover_url",
	Description:    "description",
	Status:         "status",
	WordsCount:     "words_count",
	ChaptersCount:  "chapters_count",
	Rating:         "rating",
	ReadCount:      "read_count",
	CurrentReaders: "current_readers",
	Tags:           "tags",
	CreatedAt:      "created_at",
	UpdatedAt:      "updated_at",
	DeletedAt:      "deleted_at",
	IsRecommended:  "is_recommended",
	IsFeatured:     "is_featured",
	IsHot:          "is_hot",
	Language:       "language",
}

// NewBooksDao creates and returns a new DAO object for table data access.
func NewBooksDao(handlers ...gdb.ModelHandler) *BooksDao {
	return &BooksDao{
		group:    "default",
		table:    "books",
		columns:  booksColumns,
		handlers: handlers,
	}
}

// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *BooksDao) DB() gdb.DB {
	return g.DB(dao.group)
}

// Table returns the table name of the current DAO.
func (dao *BooksDao) Table() string {
	return dao.table
}

// Columns returns all column names of the current DAO.
func (dao *BooksDao) Columns() BooksColumns {
	return dao.columns
}

// Group returns the database configuration group name of the current DAO.
func (dao *BooksDao) Group() string {
	return dao.group
}

// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *BooksDao) Ctx(ctx context.Context) *gdb.Model {
	model := dao.DB().Model(dao.table)
	for _, handler := range dao.handlers {
		model = handler(model)
	}
	return model.Safe().Ctx(ctx)
}

// Transaction wraps the transaction logic using function f.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *BooksDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
	return dao.Ctx(ctx).Transaction(ctx, f)
}
