package service

import (
	"enterprise/common/dao"
	"enterprise/common/model"
	"git.u8t.cn/open/gosdk/qyweixin"
	log "github.com/sirupsen/logrus"
	"github.com/smbrave/goutil"
)

type Checkin struct {
}

func (c *Checkin) SyncCheckin(corpId int64, startDay, endDay string) error {
	corp, err := dao.NewCorpDao().Get(corpId)
	if err != nil {
		log.Errorf("db error :%s", err.Error())
		return err
	}

	cfg := corp.GetConfig()
	qyw := qyweixin.NewAppCheckin(&qyweixin.AppConfig{
		Corpid: cfg.CorpId,
		Secret: cfg.EnterpriseSecret,
		Agent:  cfg.EnterpriseAgent,
	})

	users, err := qyw.GetCheckinEmployee(nil)
	if err != nil {
		log.Errorf("GetCheckinEmployee error :%s", err.Error())
		return err
	}

	userDatas, err := qyw.GetCheckinDataV2(startDay, endDay, users)
	if err != nil {
		log.Errorf("GetCheckinData[%s-%s]%s error :%s", startDay, endDay, goutil.EncodeJSON(users), err.Error())
		return err
	}

	for _, user := range userDatas {
		c.saveToDB(corpId, user)
	}
	return nil
}

func (c *Checkin) saveToDB(corpId int64, user *qyweixin.UserCheckIn) error {
	checkin, err := dao.NewCheckinDao().GetByDay(user.UserId, user.Day)
	if err != nil {
		log.Errorf("db error :%s", err.Error())
		return err
	}
	isNew := false
	if checkin == nil {
		checkin = new(model.Checkin)
		checkin.Day = user.Day
		checkin.Month = user.Month
		checkin.Username = user.UserId
		isNew = true
	}

	checkin.Exception = user.Exception
	checkin.StartTime = user.StartTime
	checkin.EndTime = user.EndTime
	checkin.Month = user.Month
	checkin.Rawdata = user.Rawdata
	checkin.CorpId = corpId

	if isNew {
		_, err = dao.NewCheckinDao().Create(checkin)
	} else {
		err = dao.NewCheckinDao().Update(checkin)
	}
	if err != nil {
		log.Errorf("create/update db error :%s", err.Error())
		return err
	}

	return nil
}