package service

import (
	"fmt"

	"be.ems/src/framework/constants"
	"be.ems/src/framework/database/redis"
	"be.ems/src/modules/system/model"
	"be.ems/src/modules/system/repository"
)

// NewSysI18n 实例化服务层
var NewSysI18n = &SysI18n{
	sysI18nRepository: repository.NewSysI18n,
}

// SysI18nService 多语言表 服务层处理
type SysI18n struct {
	sysI18nRepository *repository.SysI18n // 多语言服务
}

// Find 查询列表数据
func (s SysI18n) Find(SysI18n model.SysI18n) []model.SysI18n {
	return s.sysI18nRepository.Select(SysI18n)
}

// FindById 通过ID查询信息
func (s SysI18n) FindById(id int64) model.SysI18n {
	if id <= 0 {
		return model.SysI18n{}
	}
	rows := s.sysI18nRepository.SelectByIds([]int64{id})
	if len(rows) > 0 {
		return rows[0]
	}
	return model.SysI18n{}
}

// Insert 新增信息
func (s SysI18n) Insert(param model.SysI18n) int64 {
	return s.sysI18nRepository.Insert(param)
}

// Update 修改信息
func (s SysI18n) Update(param model.SysI18n) int64 {
	return s.sysI18nRepository.Update(param)
}

// DeleteByIds 批量删除信息
func (s SysI18n) DeleteByIds(ids []int64) (int64, error) {
	// 检查是否存在
	rows := s.sysI18nRepository.SelectByIds(ids)
	if len(rows) <= 0 {
		return 0, fmt.Errorf("not data")
	}
	if len(rows) == len(ids) {
		return s.sysI18nRepository.DeleteByIds(ids), nil
	}
	return 0, fmt.Errorf("delete fail")
}

// CheckUniqueByKey 检查属性名是否唯一
func (s SysI18n) CheckUniqueByKey(key string, id int64) bool {
	uniqueId := s.sysI18nRepository.CheckUnique(key)
	if uniqueId == id {
		return true
	}
	return uniqueId == 0
}

// UpdateKeyValue 更新键对应的值
func (s SysI18n) UpdateKeyValue(language, key, value string) bool {
	rows := s.sysI18nRepository.Select(model.SysI18n{
		KeyLable: key,
	})
	if len(rows) != 1 {
		return false
	}
	item := rows[0]

	// 检查是否存在
	if !s.CheckUniqueByKey(key, item.ID) {
		return false
	}

	// 更新数据
	if language == "zh" {
		item.ValueZh = value
	}
	if language == "en" {
		item.ValueEn = value
	}
	if s.sysI18nRepository.Update(item) > 0 {
		key := constants.CACHE_I18N + ":" + key
		_ = redis.Del("", key)
		value := map[string]any{
			"zh": item.ValueZh,
			"en": item.ValueEn,
		}
		_ = redis.SetHash("", key, value)
		return true
	}
	return false
}

// CacheLoad 加载多语言数据 传入*查询全部
func (s SysI18n) CacheLoad(langKey string) {
	param := model.SysI18n{
		KeyLable: langKey,
	}

	// 指定属性名
	if langKey == "*" || langKey == "" {
		param.KeyLable = ""
	}

	arr := s.sysI18nRepository.Select(param)
	if len(arr) == 0 {
		return
	}

	// 放入缓存
	for _, v := range arr {
		key := constants.CACHE_I18N + ":" + v.KeyLable
		_ = redis.Del("", key)
		value := map[string]any{
			"zh": v.ValueZh,
			"en": v.ValueEn,
		}
		_ = redis.SetHash("", key, value)
	}
}

// CacheClean 清空多语言数据 传入*清除全部
func (s SysI18n) CacheClean(langKey string) bool {
	key := constants.CACHE_I18N + ":" + langKey
	keys, err := redis.GetKeys("", key)
	if err != nil {
		return false
	}
	return redis.DelKeys("", keys) == nil
}
