package dao

import (
	"errors"
	"gorm.io/gorm"
	"youngee_b_api/app/entity"
)

type StoreDao struct{}

func (d StoreDao) CreateStore(store entity.Store) (int64, error) {
	err := Db.Model(&entity.Store{}).Create(&store).Error
	if err != nil {
		return 0, err
	}
	return store.StoreID, nil
}

func (d StoreDao) UpdateStore(store entity.Store) (int64, error) {
	err := Db.Model(&entity.Store{}).Where("store_id = ?", store.StoreID).Updates(store).Error
	if err != nil {
		return 0, err
	}
	return store.StoreID, nil
}

func (d StoreDao) DeleteStore(storeId int64) error {
	err := Db.Where("store_id = ?", storeId).Delete(&entity.Store{}).Error
	return err
}

func (d StoreDao) GetStoreByID(storeId int64) (*entity.Store, error) {
	var store entity.Store
	err := Db.Debug().Where("store_id = ?", storeId).First(&store).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		} else {
			return nil, err
		}
	}
	return &store, nil
}

func (d StoreDao) GetStoresByEnterpriseID(enterpriseId string, page int, pageSize int) ([]entity.Store, int64, error) {
	var stores []entity.Store
	var total int64
	query := Db.Model(&entity.Store{}).Where("enterprise_id = ? AND is_deleted = ?", enterpriseId, 0)
	query.Count(&total)
	// 计算偏移量
	offset := (page - 1) * pageSize
	// 分页查询
	err := query.Order("created_at desc").Offset(offset).Limit(pageSize).Find(&stores).Error
	if err != nil {
		return nil, 0, err
	}
	return stores, total, nil
}

func (d StoreDao) GetStoresByEnterpriseIDAndStoreName(enterpriseId string, storeName string, page int, pageSize int) ([]entity.Store, int64, error) {
	var stores []entity.Store
	var total int64
	query := Db.Model(&entity.Store{}).Where("enterprise_id = ? AND is_deleted = ?", enterpriseId, 0)
	if storeName != "" {
		query = query.Where("store_name LIKE ?", "%"+storeName+"%")
	}
	query.Count(&total)
	// 计算偏移量
	offset := (page - 1) * pageSize
	// 分页查询
	err := query.Order("created_at desc").Offset(offset).Limit(pageSize).Find(&stores).Error
	if err != nil {
		return nil, 0, err
	}
	return stores, total, nil
}

// 更新team_num字段值
func (d StoreDao) IncrementTeamNum(storeId int64) error {
	err := Db.Model(&entity.Store{}).Where("store_id = ?", storeId).Update("team_num", gorm.Expr("team_num + ?", 1)).Error
	return err
}

// 获取所有门店类目
func (d StoreDao) GetStoreCategory() ([]entity.StoreCategory, error) {
	var storeCategory []entity.StoreCategory
	err := Db.Model(&entity.StoreCategory{}).Find(&storeCategory).Error
	return storeCategory, err
}
