package common

import (
	"context"
	"gorm.io/gorm"
)

type PageParams struct {
	PageToken       string         `json:"pageToken,omitempty"`
	Skip            int32          `json:"skip,omitempty"`
	PageSize        int32          `json:"pageSize,omitempty"`
	EqualFilters    map[string]any `json:"equalFilters,omitempty"`
	AdvancedFilters map[string]any `json:"advancedFilters,omitempty"`
	ModelFilters    any            `json:"modelFilters,omitempty"`
	OrFilters       map[string]any `json:"orFilters,omitempty"`
	OrderBy         string         `json:"order_by,omitempty"` // sort field
	Order           string         `json:"order,omitempty"`    // [desc,asc]
	Orders          []string       `json:"orders,omitempty"`
}

type CountParams struct {
	EqualFilters    map[string]any `json:"equalFilters,omitempty"`
	AdvancedFilters map[string]any `json:"advancedFilters,omitempty"`
	ModelFilters    any            `json:"modelFilters,omitempty"`
	OrFilters       map[string]any `json:"orFilters,omitempty"`
}

type ListParams struct {
	EqualFilters    map[string]any `json:"equalFilters,omitempty"`
	AdvancedFilters map[string]any `json:"advancedFilters,omitempty"`
	ModelFilters    any            `json:"modelFilters,omitempty"`
	OrFilters       map[string]any `json:"orFilters,omitempty"`
	// OrderBy         string
	// Order           string
	Orders []string
}

type ComFilter struct {
	EqualFilters    map[string]any `json:"equalFilters,omitempty"`
	AdvancedFilters map[string]any `json:"advancedFilters,omitempty"`
	ModelFilters    any            `json:"modelFilters,omitempty"`
	OrFilters       map[string]any `json:"orFilters,omitempty"`
}
type CommonDAO interface {
	GetDB() *gorm.DB
	GetEntity(ctx context.Context, params ComFilter, modelPointer any, tx ...*gorm.DB) error
	GetEntityById(ctx context.Context, id any, modelPointer any, tx ...*gorm.DB) error

	ListEntitiesWithPagination(ctx context.Context, pageParams PageParams, modelPointer any, db ...*gorm.DB) (*Paginator, error)
	ListEntitiesWithPaginationInMemory(ctx context.Context, pageParams PageParams, modelPointer any, db *gorm.DB) (*Paginator, error)
	ListEntitiesWithPaginationGivenAllEntities(ctx context.Context, pageParams PageParams, modelArrayPointer any) (*Paginator, error)
	ListEntities(ctx context.Context, params ListParams, modelArrayPointer any, db ...*gorm.DB) error

	CreateEntity(ctx context.Context, entityPointer any, tx ...*gorm.DB) error
	SaveOrUpdateEntity(ctx context.Context, modelPointer any, tx ...*gorm.DB) error

	UpdateEntities(ctx context.Context, comParams ComFilter, updates any, model any, tx ...*gorm.DB) error
	UpdateEntityById(ctx context.Context, id any, updates any, model any, tx ...*gorm.DB) error
	UpdateAndQueryFirstEntity(ctx context.Context, comFilter ComFilter, updates any, model any, tx ...*gorm.DB) error

	DeleteEntity(ctx context.Context, params ComFilter, modelPointer any, tx ...*gorm.DB) error
	DeleteEntityById(ctx context.Context, id any, modelPointer any, tx ...*gorm.DB) error
	DeleteAll(ctx context.Context, model any, tx ...*gorm.DB) error

	CountEntities(ctx context.Context, countParams CountParams, modelArrayPointer any, tx ...*gorm.DB) (int64, error)
}
