package controller

import (
	"enterprise/common/config"
	"enterprise/common/dao"
	"enterprise/server/api"
	"enterprise/server/service"
	"enterprise/server/session"
	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
	"net/http"
	"strings"
	"time"
)

type Staff struct {
}

func NewStaff() *Staff {
	return &Staff{}
}

func (s *Staff) Login(ctx *gin.Context) {
	var req api.StaffLoginReq
	session.CheckParamError(ctx.ShouldBindJSON(&req))
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	data := service.NewStaffUser().Login(sess, &req)
	ctx.JSON(http.StatusOK, session.NewRsp(data))
}

func (s *Staff) Suggest(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	staffs, _, err := dao.NewStaffUserDao().Query(1, -1, sess.GetCorpId(), 0, "", "", "", "")
	session.CheckDBError(err)
	items := make([]map[string]interface{}, 0)
	for _, st := range staffs {
		mp := make(map[string]interface{})
		mp["userid"] = cast.ToString(st.Id)
		mp["username"] = cast.ToString(st.Username)
		mp["realname"] = cast.ToString(st.Realname)
		items = append(items, mp)
	}
	ctx.JSON(http.StatusOK, session.NewRsp(items))
}

func (s *Staff) List(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	var req api.StaffListReq
	session.CheckParamError(ctx.ShouldBind(&req))
	req.Default()
	total, items := service.NewStaffUser().List(sess, &req)
	ctx.JSON(http.StatusOK, session.NewListRsp(total, items))
}

func (s *Staff) Create(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	if !sess.GetAdmin().GetConfig().IsHr() {
		panic(config.ErrPriv.New())
	}

	var req api.StaffCreateReq
	session.CheckParamError(ctx.ShouldBindJSON(&req))
	ctx.Keys[session.ContextRequest] = req
	service.NewStaffUser().Create(sess, &req)
	ctx.JSON(http.StatusOK, session.NewRspOk())
}

func (s *Staff) Update(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	if !sess.GetAdmin().GetConfig().IsHr() {
		panic(config.ErrPriv.New())
	}
	var req api.StaffUpdateReq

	session.CheckParamError(ctx.ShouldBindJSON(&req))
	ctx.Keys[session.ContextRequest] = req
	service.NewStaffUser().Update(sess, &req)
	ctx.JSON(http.StatusOK, session.NewRspOk())
}

func (s *Staff) Delete(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	if !sess.GetAdmin().GetConfig().IsHr() {
		panic(config.ErrPriv.New())
	}

	id := cast.ToInt64(ctx.Query("id"))
	session.CheckDBError(dao.NewStaffUserDao().Delete(id))
	ctx.JSON(http.StatusOK, session.NewRspOk())
}

func (s *Staff) Pay(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	if !sess.GetAdmin().GetConfig().IsAdmin() {
		panic(config.ErrPriv.New())
	}
	var req api.StaffPayReq
	session.CheckParamError(ctx.ShouldBindJSON(&req))
	ctx.Keys[session.ContextRequest] = req
	service.NewStaffUser().Pay(sess, &req)
	ctx.JSON(http.StatusOK, session.NewRspOk())
}

func (s *Staff) Salary(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	month := ctx.Query("month")
	tp := ctx.Query("type")

	corp, err := dao.NewCorpDao().GetByHost(sess.GetHeader().Host)
	session.CheckDBError(err)
	session.CheckNilError(corp, "企业不存在")

	if month == "" {
		month = time.Now().AddDate(0, -1, 0).Format("200601")
	}
	month = strings.ReplaceAll(month, "-", "")
	if tp == "" {
		tp = service.StaffSalaryTypeSummary
	}
	serv := new(service.StaffSalary)

	if tp == service.StaffSalaryTypeAgent {
		serv.Agent(corp.Id, month, ctx)
	} else if tp == service.StaffSalaryTypeBank {
		serv.Bank(corp.Id, month, ctx)
	} else {
		serv.Summary(corp.Id, month, ctx)
	}
}