package service

import (
	"enterprise/common/dao"
	"enterprise/common/model"
	"enterprise/server/api"
	"enterprise/server/session"
	"git.u8t.cn/open/gosdk/qyweixin"
	"github.com/google/uuid"
	log "github.com/sirupsen/logrus"
	"github.com/smbrave/goutil"
	"github.com/spf13/cast"
	"time"
)

type StaffUser struct {
}

func NewStaffUser() *StaffUser {
	return &StaffUser{}
}

func (s *StaffUser) Login(sess *session.AdminSession, req *api.StaffLoginReq) interface{} {
	host := sess.GetHeader().Host
	log.Infof("login host[%s] req[%s]", host, goutil.EncodeJSON(req))

	corp, err := dao.NewCorpDao().GetByHost(host)
	session.CheckDBError(err)
	session.CheckNilError(corp, "企业不存在的域名")

	user, err := dao.NewStaffUserDao().GetByUsername(corp.Id, req.Username)
	session.CheckDBError(err)
	session.CheckNilError(user, "企业用户不存在")

	if user.Password == "" || user.Password != req.Password {
		panic("密码错误")
	}

	token := new(model.StaffToken)
	token.UserId = user.Id
	token.ExpireTime = time.Now().Unix() + 86400
	token.Token = uuid.New().String()
	_, err = dao.NewStaffTokenDao().Create(token)
	session.CheckDBError(err)

	data := token.ToLogin()
	data["username"] = user.Username
	data["realname"] = user.Realname
	return data
}

func (s *StaffUser) Create(sess *session.AdminSession, req *api.StaffCreateReq) {

	staffUser, err := dao.NewStaffUserDao().GetByUsername(sess.GetAdmin().CorpId, req.Username)
	session.CheckDBError(err)
	if staffUser != nil {
		panic("用户已存在")
	}

	hrAssiant := s.getHrAssiant(sess.GetCorpId())

	staffInfo, err := hrAssiant.GetStaffInfo(req.Username)
	if err != nil {
		log.Warnf("getstaff info username[%s] error :%s", req.Username, err.Error())
	}

	staffUser = new(model.StaffUser)
	if staffInfo != nil {
		staffUser.Realname = staffInfo.RealName
		staffUser.Phone = staffInfo.Phone
		staffUser.Idno = staffInfo.Idno
		staffUser.EntryDate = staffInfo.EntryDate
		staffUser.OfficialDate = staffInfo.OfficialDate
	}

	staffUser.CorpId = sess.GetAdmin().CorpId
	staffUser.Username = req.Username
	staffUser.Status = model.StaffUserStatusOnline
	_, err = dao.NewStaffUserDao().Create(staffUser)
	session.CheckDBError(err)
}

func (s *StaffUser) Update(sess *session.AdminSession, req *api.StaffUpdateReq) {

	staffUser, err := dao.NewStaffUserDao().Get(cast.ToInt64(req.Id))
	session.CheckDBError(err)
	session.CheckNilError(staffUser, "用户不存在")

	hrAssiant := s.getHrAssiant(sess.GetCorpId())
	staffInfo, err := hrAssiant.GetStaffInfo(req.Username)
	if err != nil {
		log.Warnf("getstaff info username[%s] error :%s", req.Username, err.Error())
	}
	if staffInfo != nil {
		staffUser.Realname = goutil.If(staffUser.Realname == "", staffInfo.RealName, staffUser.Realname)
		staffUser.Phone = goutil.If(staffUser.Phone == "", staffInfo.Phone, staffUser.Phone)
		staffUser.Idno = goutil.If(staffUser.Idno == "", staffInfo.Idno, staffUser.Idno)
	}

	staffUser.Username = goutil.If(req.Username != "", req.Username, staffUser.Username)
	staffUser.Realname = goutil.If(req.Realname != "", req.Realname, staffUser.Realname)
	staffUser.Phone = goutil.If(req.Phone != "", req.Phone, staffUser.Phone)
	staffUser.Idno = goutil.If(req.Idno != "", req.Idno, staffUser.Idno)
	staffUser.EntryDate = goutil.If(req.EntryDate != "", req.EntryDate, staffUser.EntryDate)
	staffUser.OfficialDate = goutil.If(req.OfficialDate != "", req.OfficialDate, staffUser.OfficialDate)
	staffUser.Config = goutil.If(req.Config != "", req.Config, staffUser.Config)

	staffSalary := staffUser.GetSalary()
	staffSalary.Base = goutil.If(req.SalaryBase != "", req.SalaryBase, staffSalary.Base)
	staffSalary.Target = goutil.If(req.SalaryTarget != "", req.SalaryTarget, staffSalary.Target)
	staffSalary.Calculator = goutil.If(req.SalaryCalculator != "", req.SalaryCalculator, staffSalary.Calculator)
	staffUser.Salary = goutil.EncodeJSON(staffSalary)

	staffPayee := staffUser.GetPayee()
	staffPayee.BankName = goutil.If(req.PayeeBankName != "", req.PayeeBankName, staffPayee.BankName)
	staffPayee.BankCard = goutil.If(req.PayeeBankCard != "", req.PayeeBankCard, staffPayee.BankCard)
	staffPayee.AlipayUid = goutil.If(req.PayeeAlipayUid != "", req.PayeeAlipayUid, staffPayee.AlipayUid)
	staffUser.Payee = goutil.EncodeJSON(staffPayee)

	//状态处理
	if req.Status != "" {
		status := cast.ToInt(req.Status)
		staffUser.Status = goutil.If(req.Status != "", cast.ToInt(req.Status), staffUser.Status)
		if status == model.StaffUserStatusOffline {
			staffUser.LeaveDate = goutil.If(req.LeaveDate != "", req.LeaveDate, staffUser.LeaveDate)
		} else {
			staffUser.LeaveDate = ""
		}
	}

	err = dao.NewStaffUserDao().Update(staffUser)
	session.CheckDBError(err)
}

func (s *StaffUser) getHrAssiant(corpId int64) *qyweixin.AppHr {
	corp, err := dao.NewCorpDao().Get(corpId)
	session.CheckDBError(err)
	session.CheckNilError(corp, "企业不存在")
	corpCfg := corp.GetConfig()
	hrAssiant := qyweixin.NewAppHr(&qyweixin.AppConfig{
		Corpid: corpCfg.CorpId,
		Secret: corpCfg.EnterpriseSecret,
		Agent:  corpCfg.EnterpriseAgent,
	})
	return hrAssiant
}