package worker

import (
	"enterprise/common/dao"
	"enterprise/common/global"
	"enterprise/common/model"
	"enterprise/service"
	"fmt"
	log "github.com/sirupsen/logrus"
	"github.com/smbrave/goutil"
	"github.com/spf13/cast"
	"strings"
	"time"
)

type Staff struct {
}

func (s *Staff) MontorWorkAge(corpId int64) {
	staffs, err := dao.NewStaffUserDao().Query(corpId, model.StaffUserStatusOnline)
	if err != nil {
		log.Errorf("db error :%s", err.Error())
		return
	}

	nowDate := time.Now()
	for _, staff := range staffs {
		//离职的忽略
		if staff.LeaveDate != "" {
			continue
		}

		entryDate, _ := time.ParseInLocation("2006-01-02", staff.EntryDate, time.Local)
		OfficialDate, _ := time.ParseInLocation("2006-01-02", staff.OfficialDate, time.Local)

		entryMonth := (nowDate.Year()-entryDate.Year())*12 + int(nowDate.Month()) - int(entryDate.Month())
		officalDay := (OfficialDate.Unix() - nowDate.Unix()) / 86400
		log.Infof("staff[%s] entryDate[%s] spanMonth[%.1f]", staff.Username, staff.EntryDate, float64(entryMonth)/12.0)

		salary := staff.GetSalary()
		if nowDate.Day() == 1 && entryMonth%6 == 0 {
			message := make([]string, 0)
			message = append(message, fmt.Sprintf("【员工半年提醒】[%s]", staff.Realname))
			message = append(message, fmt.Sprintf("入职时间:%s", staff.EntryDate))
			message = append(message, fmt.Sprintf("入职年限:%.1f", float64(entryMonth)/12))
			message = append(message, fmt.Sprintf("基本工资:%s", salary.Base))
			message = append(message, fmt.Sprintf("绩效工资:%s", salary.Target))
			message = append(message, fmt.Sprintf("身份证号:%s", staff.Idno))

			if err := global.SendMessage([]string{"jiangyong"}, strings.Join(message, "\n")); err != nil {
				log.Errorf("send message error :%s", err.Error())
			}
		}

		if officalDay > 0 && officalDay <= 30 && officalDay%7 == 0 {
			message := make([]string, 0)
			message = append(message, fmt.Sprintf("【员工转正提醒】[%s]", staff.Realname))
			message = append(message, fmt.Sprintf("入职时间:%s", staff.EntryDate))
			message = append(message, fmt.Sprintf("转正时间:%s", staff.OfficialDate))
			message = append(message, fmt.Sprintf("基本工资:%s", salary.Base))
			message = append(message, fmt.Sprintf("绩效工资:%s", salary.Target))
			message = append(message, fmt.Sprintf("身份证号:%s", staff.Idno))

			if err := global.SendMessage([]string{"jiangyong"}, strings.Join(message, "\n")); err != nil {
				log.Errorf("send message error :%s", err.Error())
			}
		}
	}
}

func (s *Staff) SendStaffSalaryBill(corpId int64, month string) {
	staffSalarys, err := dao.NewStaffSalaryDao().Query(corpId, 0, month)
	if err != nil {
		log.Errorf("db error :%s", err.Error())
		return
	}

	for _, staffSalary := range staffSalarys {
		if staffSalary.Salary < 0.1 {
			continue
		}
		user, err := dao.NewStaffUserDao().Get(staffSalary.UserId)
		if err != nil {
			log.Errorf("db error :%s", err.Error())
			continue
		}

		message := make([]string, 0)
		message = append(message, fmt.Sprintf("【工资单】[%s][%s]", user.Username, month))
		message = append(message, fmt.Sprintf("基本工资:%.2f", staffSalary.Salary))
		if staffSalary.AttendSalary >= 0.1 {
			message = append(message, fmt.Sprintf("出勤工资:%.2f", staffSalary.AttendSalary))
		}
		if staffSalary.AwardSalary >= 0.1 {
			message = append(message, fmt.Sprintf("奖金收入:%.2f", staffSalary.AwardSalary))
		}
		if staffSalary.OtherSalary >= 0.1 {
			message = append(message, fmt.Sprintf("其他收入:%.2f", staffSalary.OtherSalary))
		}

		message = append(message, fmt.Sprintf("社保扣除:%.2f", staffSalary.SocialDeduct+staffSalary.HouseDeduct))
		message = append(message, fmt.Sprintf("个税扣除:%.2f", staffSalary.PersonalDeduct))
		message = append(message, fmt.Sprintf("实发工资:%.2f", staffSalary.GetRealSalary()))

		if err := global.SendMessage([]string{"jiangyong"}, strings.Join(message, "\n")); err != nil {
			log.Errorf("send message error :%s", err.Error())
		}

	}
}

func (s *Staff) SyncStaffSalary(corpId int64, month string) {
	if month == "" {
		month = time.Now().AddDate(0, -1, 0).Format("2006-01")
	}
	month = strings.ReplaceAll(month, "-", "")

	staffs, err := dao.NewStaffUserDao().Query(corpId, 0)
	if err != nil {
		log.Errorf("query staff db error :%s", err.Error())
		return
	}
	for _, staff := range staffs {
		// 已离职的员工不处理
		if staff.LeaveDate != "" {
			leaveTime, _ := time.ParseInLocation("2006-01-02", staff.LeaveDate, time.Local)
			isLeaveMonth := goutil.If(cast.ToInt(leaveTime.Format("200601")) == cast.ToInt(month), true, false)
			if !isLeaveMonth {
				continue
			}
		}

		salary, err := dao.NewStaffSalaryDao().GetBy(corpId, staff.Id, month)
		if err != nil {
			log.Errorf("db error :%s", err.Error())
			continue
		}

		staffService := service.NewStaffSalary(staff)
		salary, err = staffService.CalcSalary(salary, month)
		if err != nil {
			log.Errorf("username[%s] staffService.CalcSalary error :%s", staff.Username, err.Error())
			continue
		}
		if salary == nil {
			continue
		}

		if salary.Id == 0 {
			_, err = dao.NewStaffSalaryDao().Create(salary)
		} else {
			err = dao.NewStaffSalaryDao().Update(salary)
		}
		if err != nil {
			log.Errorf("db error :%s", err.Error())
		}
	}

}