package checkin

import (
	"fmt"

	"github.com/silenceper/wechat/v2/util"
)

const (
	// getCheckinDataURL 获取打卡记录数据
	getCheckinDataURL = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=%s"
)

type (
	// GetCheckinDataRequest 获取打卡记录数据请求
	GetCheckinDataRequest struct {
		OpenCheckinDataType int64    `json:"opencheckindatatype"`
		StartTime           int64    `json:"starttime"`
		EndTime             int64    `json:"endtime"`
		UserIDList          []string `json:"useridlist"`
	}
	// GetCheckinDataResponse 获取打卡记录数据响应
	GetCheckinDataResponse struct {
		util.CommonError
		CheckinData []*GetCheckinDataItem `json:"checkindata"`
	}
	// GetCheckinDataItem 打卡记录数据
	GetCheckinDataItem struct {
		UserID         string   `json:"userid"`
		GroupName      string   `json:"groupname"`
		CheckinType    string   `json:"checkin_type"`
		ExceptionType  string   `json:"exception_type"`
		CheckinTime    int64    `json:"checkin_time"`
		LocationTitle  string   `json:"location_title"`
		LocationDetail string   `json:"location_detail"`
		WifiName       string   `json:"wifiname"`
		Notes          string   `json:"notes"`
		WifiMac        string   `json:"wifimac"`
		MediaIDs       []string `json:"mediaids"`
		SchCheckinTime int64    `json:"sch_checkin_time"`
		GroupID        int64    `json:"groupid"`
		ScheduleID     int64    `json:"schedule_id"`
		TimelineID     int64    `json:"timeline_id"`
		Lat            int64    `json:"lat,omitempty"`
		Lng            int64    `json:"lng,omitempty"`
		DeviceID       string   `json:"deviceid,omitempty"`
	}
)

// GetCheckinData 获取打卡记录数据
// @see https://developer.work.weixin.qq.com/document/path/90262
func (r *Client) GetCheckinData(req *GetCheckinDataRequest) (*GetCheckinDataResponse, error) {
	var (
		accessToken string
		err         error
	)
	if accessToken, err = r.GetAccessToken(); err != nil {
		return nil, err
	}
	var response []byte
	if response, err = util.PostJSON(fmt.Sprintf(getCheckinDataURL, accessToken), req); err != nil {
		return nil, err
	}
	result := &GetCheckinDataResponse{}
	if err = util.DecodeWithError(response, result, "GetCheckinData"); err != nil {
		return nil, err
	}
	return result, nil
}
