package service

import (
	"encoding/json"
	"errors"
	"spaceofcheng/services/models"
	"spaceofcheng/services/models/model"
	"spaceofcheng/services/utils"

	"github.com/astaxie/beego"
)

const (
	PAGENUM = 10
)

// SysServ 系统处理
type SysServ struct {
	ctx *utils.Context
	dao *models.SysDAO
}

// NewSysServ 初始化
func NewSysServ(ctx *utils.Context) *SysServ {
	return &SysServ{
		ctx: ctx,
		dao: models.NewSysDAO(ctx),
	}
}

// SetUserProfile 设置用户信息
func (s *SysServ) SetUserProfile(id string) error {
	user, err := s.dao.GetPureUserInfo(id)
	if err != nil {
		return utils.LogError("获取用户基本信息失败: " + err.Error())
	}
	s.ctx.Set("user", *user)

	cases, err := s.dao.GetUserCase(id)
	if err != nil {
		return utils.LogError("获取用户案场信息失败: " + err.Error())
	}
	s.ctx.Set("cases", cases)

	found := false
	for _, cs := range cases {
		if cs.IsBelong == models.BOOL_TRUE {
			found = true
			s.ctx.Set("currentCase", cs)
		}
	}

	if !found {
		utils.LogError("用户没有设置默认案场")
	}

	return nil
}

// SetCustomer 设置客户信息
func (s *SysServ) SetCustomer(id string) error {
	cust, err := s.dao.GetCustomer(id)
	if err != nil {
		return utils.LogError("获取客户基本信息失败: " + err.Error())
	}

	s.ctx.Set("customer", *cust)
	return nil
}

// CheckWechatUserMapping 校验并更新客户信息
// 如果不存在, 则插入新数据
func (s *SysServ) CheckWechatUserMapping(user map[string]interface{}) (*model.TaUserMapping, error) {
	openID := user["openid"].(string)

	uuID := ""
	uuidRaw, ok := user["unionid"]
	if ok {
		uuID = uuidRaw.(string)
	}

	accountRaw, err := json.Marshal(user)
	if err != nil {
		beego.Error(err)
		return nil, err
	}
	account := string(accountRaw)

	userMapping := model.TaUserMapping{
		UserType:    models.USERMAP_CUSTOMER,
		AccountType: models.ACCMAP_WECHAT,
		Openid:      openID,
		Uuid:        uuID,
		AccountInfo: account,
	}

	// 查询数据库是否存在已有映射
	userMapList, err := s.dao.GetUserMappingByOpenID(openID)
	if err != nil {
		beego.Error(err)
		return nil, err
	}

	// 如果存在
	if len(userMapList) > 0 {
		for _, um := range userMapList {
			if userMapping.Openid == um.Openid &&
				userMapping.AccountType == um.AccountType &&
				userMapping.UserType == um.UserType {
				userMapping.UserId = um.UserId

				// 存在的用户, 使用 ID 作为检查条件去更新
				userMapping.MappingId = um.MappingId
			}
		}
	}

	// 更新数据库内容, 没有的话则插入
	err = s.dao.UpdateUserMapping(&userMapping)
	if err != nil {
		return nil, err
	}

	return &userMapping, nil
}

// GetWeChatConfig 获取微信配置
func (s SysServ) GetWeChatConfig(org string) (map[string]string, error) {
	conf, err := s.dao.GetWeChatConfig(org)
	if err != nil {
		return nil, err
	}

	if conf.ConfId == "" {
		return nil, errors.New("未找到微信配置")
	}

	return map[string]string{
		"appid":  conf.Appid,
		"secret": conf.Secret,
		"token":  conf.Token,
		"aeskey": conf.Aeskey,
		"wxid":   conf.Wxid,
	}, nil
}

// SetOrgByID 获取组织
func (s SysServ) SetOrgByID(orgID string) error {
	orgID = utils.DecodeBase64NoTail(orgID)

	org, err := s.dao.GetOrg(orgID)
	if err != nil {
		utils.LogError("获取组织信息失败: " + err.Error())
		return errors.New("获取组织信息失败")
	}

	s.ctx.Set("org", *org)

	return nil
}
