package dao

import (
	"fmt"
	"micro-bundle/internal/model"
	"micro-bundle/pb/bundle"
	"micro-bundle/pkg/app"

	"gorm.io/gorm"
)

// 增值套餐创建
func CreateValueAddBundle(req *model.ValueAddBundleProfile) (err error) {
	err = app.ModuleClients.BundleDB.Model(&model.ValueAddBundleProfile{}).Create(&req).Error
	if err != nil {
		return
	}

	return
}

// 增值套餐列表
func ValueAddBundleList(priceType int32) (valueAddBundleProfile []*model.ValueAddBundleProfile, err error) {
	err = app.ModuleClients.BundleDB.Where("price_type = ?", priceType).Order("num ASC").Find(&valueAddBundleProfile).Error
	if err != nil {
		return
	}
	return
}

// 增值套餐详情
func ValueAddBundleDetail(uuid string) (valueAddBundleProfile *model.ValueAddBundleProfile, err error) {

	err = app.ModuleClients.BundleDB.Where("uuid = ?", uuid).First(&valueAddBundleProfile).Error
	if err != nil {
		return
	}

	return
}

func BundleProfileDetail(uuid string) (bundleProfile *model.BundleProfile, err error) {
	err = app.ModuleClients.BundleDB.Where("uuid = ?", uuid).First(&bundleProfile).Error
	if err != nil {
		return
	}

	return
}

func BundleOrderRecordsDetailByAddUid(uuid string) (bundleOrderRecords *model.BundleOrderRecords, err error) {

	err = app.ModuleClients.BundleDB.Where("value_add_bundle_uuid = ?", uuid).First(&bundleOrderRecords).Error
	if err != nil {
		return
	}

	return
}

func GetBundleOrderRecordsByUserIdAndBundleUuid(userId int32, uuid string) (bundleOrderRecords *model.BundleOrderRecords, err error) {

	err = app.ModuleClients.BundleDB.Where("customer_id = ? AND bundle_uuid = ?", userId, uuid).First(&bundleOrderRecords).Error
	if err != nil {
		return
	}

	return
}

func GetBundleOrderRecordsByCommonUidAndUserId(commonUid string, userId int32) (bundleOrderRecords *model.BundleOrderRecords, err error) {

	err = app.ModuleClients.BundleDB.Where("bundle_common_uid = ? AND customer_id = ?", commonUid, userId).First(&bundleOrderRecords).Error
	if err != nil {
		return
	}

	return
}

// ***************************************新增值服务*****************************
// 增值套餐主表创建
func CreateValueAddService(tx *gorm.DB, req *model.ValueAddService) (err error) {
	if err := tx.Model(&model.ValueAddService{}).Create(req).Error; err != nil {
		return err
	}
	return
}

// 增值套餐语言表创建
func CreateValueAddServiceLang(tx *gorm.DB, req *model.ValueAddServiceLang) (err error) {
	if err := tx.Model(&model.ValueAddServiceLang{}).Create(req).Error; err != nil {
		return err
	}
	return
}

// 增值套餐主表更新
func UpdateValueAddService(tx *gorm.DB, columns map[string]interface{}) (err error) {
	err = tx.Model(&model.ValueAddService{}).Where("uuid = ?", columns["uuid"]).Updates(columns).Error
	if err != nil {
		return
	}
	return
}
func UpdateValueAddServiceLang(tx *gorm.DB, columns map[string]interface{}) (err error) {
	err = tx.Model(&model.ValueAddServiceLang{}).Where("uuid =?", columns["uuid"]).
		Where("language", columns["language"]).Updates(columns).Error
	if err != nil {
		return
	}
	return
}

// 增值套餐列表
func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res []*model.ValueAddService, total int64, err error) {
	query := app.ModuleClients.BundleDB.Model(&model.ValueAddService{}).
		Preload("ValueAddServiceLang", func(db *gorm.DB) *gorm.DB {
			return db.Select("uuid,service_name,service_type,price_mode,original_price,unit,language,price_type,options,created_at,updated_at")
		})

	count := *query
	if req.PageSize != 0 && req.Page != 0 {
		query = query.Limit(int(req.PageSize)).Offset(int(req.Page-1) * int(req.PageSize))
	}
	if err = query.Find(&res).Error; err != nil {
		return
	}
	// 统计不同uuid的数量
	err = count.Select("uuid").Group("uuid").Count(&total).Error
	return
}

// 增值套餐详情
func ValueAddServiceDetail(uuid string) (valueAddServiceDetail *model.ValueAddService, err error) {
	var data model.ValueAddService
	err = app.ModuleClients.BundleDB.Where("uuid = ?", uuid).Preload("ValueAddServiceLang").First(&data).Error
	if err != nil {
		return nil, err
	}
	return &data, nil
}

// 通过uuid和language查询增值套餐
func ValueAddServiceDetailByUuidAndLanguage(uuid string, language string) (valueAddServiceLang *model.ValueAddServiceLang, err error) {
	err = app.ModuleClients.BundleDB.Where("uuid = ? AND language = ?", uuid, language).First(&valueAddServiceLang).Error
	if err != nil {
		return nil, err
	}
	return
}

// 通过增值服务UUID查询所有关联套餐
func GetBundleToValueAddServiceByValueUid(valueUid string) ([]model.BundleToValueAddService, error) {
	var rels []model.BundleToValueAddService
	err := app.ModuleClients.BundleDB.Model(&model.BundleToValueAddService{}).
		Where("value_uid = ?", valueUid).
		Find(&rels).Error
	return rels, err
}
func GetValueAddServiceDetailByUuid(tx *gorm.DB, uuid string) (*model.ValueAddService, error) {
	result := &model.ValueAddService{}
	err := tx.Model(&model.ValueAddService{}).
		Preload("ValueAddServiceLang", "deleted_at = 0").
		Where("uuid =? and deleted_at=0", uuid).
		First(&result).Error
	return result, err
}
func CreateValueAddServiceHistory(tx *gorm.DB, req *model.ValueAddServiceHistory) error {
	return tx.Model(&model.ValueAddServiceHistory{}).Create(req).Error
}
func BatchValueAddServiceDetailTx(tx *gorm.DB, uids []string) (map[string]*model.ValueAddService, error) {
	if len(uids) == 0 {
		return map[string]*model.ValueAddService{}, nil // 返回空 map,避免 nil panic
	}
	var results []*model.ValueAddService
	err := tx.Model(&model.ValueAddService{}).
		Where("uuid IN ? AND deleted_at = 0", uids).
		Preload("ValueAddServiceLang", "deleted_at = 0").
		Find(&results).Error
	if err != nil {
		return nil, fmt.Errorf("批量查询增值服务失败: %w", err)
	}
	resultMap := make(map[string]*model.ValueAddService, len(results))
	for _, detail := range results {
		resultMap[detail.UUID] = detail
	}
	return resultMap, nil
}