package services

import (
	"context"
	"encoding/json"
	"fmt"
	"github.com/tealeg/xlsx"
	"hongze/hongze_cygx/models"
	"hongze/hongze_cygx/utils"
	"io/ioutil"
	"net/http"
	"os"
	"path/filepath"
	"strconv"
	"strings"
	"time"
)

type GetShangHaiTokenResultApi struct {
	Code int                   `json:"code"`
	Msg  string                `json:"msg"`
	Time int                   `json:"time"`
	Data ShangHaiResultApidate `json:"data"`
}

type ShangHaiResultApidate struct {
	AccessToken string `json:"access_token"`
	ExpireIn    int    `json:"expire_in"`
}

type GetShangHaiTokenResultApiComPany struct {
	Code int       `json:"code"`
	Msg  string    `json:"msg"`
	Time int       `json:"time"`
	Data FailInfos `json:"data"`
}
type FailInfos struct {
	TotalCount int                            `json:"total_count"`
	FailInfo   []ShangHaiResultApidateComPany `json:"fail_info"`
}

type ShangHaiResultApidateComPany struct {
	ErrVal string `json:"errVal"`
	ErrMsg string `json:"errMsg"`
}

//c
func SendComapnyToShanghai(url, jsonCompany, postType string) (err error) {
	var msg string
	defer func() {
		if err != nil {
			go utils.SendAlarmMsg(msg, 1)
			go utils.SendEmail("同步策略平台获取数据信息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToExpert)
		}
	}()
	method := "POST"
	payload := strings.NewReader(jsonCompany)
	client := &http.Client{}
	req, err := http.NewRequest(method, url, payload)
	if err != nil {
		msg = "NewRequest Err:" + err.Error()
		return err
	}
	req.Header.Add("Content-Type", "application/json")
	res, err := client.Do(req)
	if err != nil {
		msg = "client.Do Err:" + err.Error()
		return err
	}
	defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		msg = "ioutil.ReadAll Err:" + err.Error()
		return err
	}
	var result GetShangHaiTokenResultApiComPany
	err = json.Unmarshal(body, &result)
	if err != nil {
		msg = "json.Unmarshal Err:" + err.Error()
		return err

	}
	item := new(models.CygxShanghaiCompanyLog)
	item.CreateTime = time.Now()
	item.Url = url
	item.Body = jsonCompany
	item.Result = string(body)
	go models.AddCygxShanghaiCompanyLog(item)

	for _, v := range result.Data.FailInfo {
		if v.ErrMsg != "" {
			//companyCode += "'" + v.ErrVal + "',"
			item := new(models.CygxShanghaiErrLog)
			item.CreateTime = time.Now()
			item.ErrMsg = v.ErrMsg
			item.ErrVal = v.ErrVal
			item.ErrType = postType
			go models.AddCygxShanghaiErrLog(item)
		}
	}
	return
}

func DotongbuShangHai(cont context.Context) (err error) {
	var condition string
	updateTime := time.Now().Add(-time.Minute * 22).Format("2006-01-02 15:04:05")
	listUpdateUser, err := models.GetWxUserOpLog(updateTime)
	if err != nil && err.Error() != utils.ErrNoRow() {
		return err
	}
	var companyIds string
	if len(listUpdateUser) > 0 {
		for _, v := range listUpdateUser {
			companyIds += strconv.Itoa(v.CompanyId) + ","
		}
	}
	condition = ` AND p.modify_time > ` + "'" + updateTime + "'"
	companyIds = strings.TrimRight(companyIds, ",")
	if companyIds != "" {
		//这一部分先不推送,避免并发推送
		condition += ` AND c.company_id  NOT  IN (` + companyIds + ") "
	}

	//偶尔需要单独同步某一个公司的人员
	//condition = ` AND c.company_id  =  8284  `
	//同30小时有变更的公司
	go DotongbuShangHaApi(condition)

	//原有的公司如果新增了也同步
	//companyIds = strings.TrimRight(companyIds, ",")
	if companyIds != "" {
		condition = ` AND c.company_id  IN (` + companyIds + ")"
		go DotongbuShangHaApi(condition)
	}
	return
}

//func DotongbuShangHai(cont context.Context) (err error) {
func DotongbuShangHaApi(condition string) (err error) {
	var msg string
	defer func() {
		if err != nil {
			go utils.SendAlarmMsg("同步策略平台获取数据信息失败", 2)
			go utils.SendEmail("同步策略平台获取数据信息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToExpert)
		}
	}()
	//同步24小时之前的数据到上海平台,为防止遗漏改成30小时

	//updateTime := time.Now().Add(-time.Hour * 30).Format("2006-01-02 15:04:05")
	//condition = ` AND p.modify_time > ` + "'" + updateTime + "'"
	//fmt.Println(condition)
	//获取token
	url := "https://crm.hzinsights.com/openapi/v1/auth/getAccessToken?app_key=26945134&app_secret=b99cb2bdec70d20156000f664ec5ac30"
	method := "GET"
	client := &http.Client{}
	req, err := http.NewRequest(method, url, nil)
	if err != nil {
		msg = "GetToken Err:" + err.Error()
		return err
	}
	res, err := client.Do(req)
	if err != nil {
		msg = "client Err:" + err.Error()
		return err
	}
	defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		msg = "body Err:" + err.Error()
		return
	}
	var result GetShangHaiTokenResultApi
	err = json.Unmarshal(body, &result)
	if err != nil {
		msg = "Get result Err:" + err.Error()
		return
	}
	accessToken := result.Data.AccessToken
	fmt.Println(accessToken)
	//同步权益客户
	companyList, err := models.GetSendCompanyList(condition)
	if err != nil {
		msg = "GetSendCompanyList Err:" + err.Error()
		return
	}
	fmt.Println("权益客户", len(companyList))
	var companyItems []*models.CompanyJson
	if len(companyList) > 0 {
		url = "https://crm.hzinsights.com/openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken
		for k, _ := range companyList {
			companyList[k].Fe = "权益"
			companyList[k].EndDate = strconv.Itoa(int(companyList[k].EndDateTime.Unix()))
			//一次同步一百条
			companyItems = append(companyItems, companyList[k])
			if (k+1)%100 == 0 {
				data, err := json.Marshal(companyItems)
				if err != nil {
					msg = "companyItems Err:" + err.Error()
					return err
				}
				jsonstr := string(data)
				jsonstr = "{\"sync_data\": " + jsonstr + " }"
				SendComapnyToShanghai(url, jsonstr, "权益")
				companyItems = make([]*models.CompanyJson, 0)
			}
		}
		//如果剩下还有则同步剩下的部分
		if len(companyItems) > 0 {
			data, err := json.Marshal(companyItems)
			if err != nil {
				msg = "companyItems Err:" + err.Error()
				return err
			}
			jsonstr := string(data)
			jsonstr = "{\"sync_data\": " + jsonstr + " }"
			SendComapnyToShanghai(url, jsonstr, "权益")
			companyItems = make([]*models.CompanyJson, 0)
		}
	}
	//同步FICC客户
	companyFiccList, err := models.GetSendCompanyFiccList(condition)
	if err != nil {
		msg = "GetSendCompanyFiccList Err:" + err.Error()
		return err
	}
	fmt.Println("FICC客户", len(companyFiccList))
	var companyFiccItems []*models.CompanyJson
	if len(companyFiccList) > 0 {
		url = "https://crm.hzinsights.com/openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken
		for k, _ := range companyFiccList {
			companyFiccList[k].Fe = "FICC"
			companyFiccList[k].EndDate = strconv.Itoa(int(companyFiccList[k].EndDateTime.Unix()))
			//一次同步一百条
			companyFiccItems = append(companyFiccItems, companyFiccList[k])
			if (k+1)%100 == 0 {
				data, err := json.Marshal(companyFiccItems)
				if err != nil {
					msg = "companyFiccItems Err:" + err.Error()
					return err
				}
				jsonstr := string(data)
				jsonstr = "{\"sync_data\": " + jsonstr + " }"
				SendComapnyToShanghai(url, jsonstr, "FICC")
				companyFiccItems = make([]*models.CompanyJson, 0)
			}
		}
		//如果剩下还有则同步剩下的部分
		if len(companyFiccItems) > 0 {
			data, err := json.Marshal(companyFiccItems)
			if err != nil {
				msg = "companyFiccItems Err:" + err.Error()
				return err
			}
			jsonstr := string(data)
			jsonstr = "{\"sync_data\": " + jsonstr + " }"
			SendComapnyToShanghai(url, jsonstr, "FICC")
		}
	}

	userList, err := models.GetSendUserList(condition)
	if err != nil {
		msg = "GetSendUserList Err:" + err.Error()
		return err
	}
	fmt.Println("用户", len(userList))
	var userItems []*models.UserJson
	if len(userList) > 0 {
		url = "https://crm.hzinsights.com/openapi/v1/CustomerContact/batchSyncFiccCustomerContact?access_token=" + accessToken
		for k, v := range userList {
			if v.Sex == "1" {
				userList[k].Sex = "男"
			} else {
				userList[k].Sex = "女"
			}
			if v.IsMaker == "1" {
				userList[k].IsMaker = "是"
			} else {
				userList[k].IsMaker = "否"
			}
			userList[k].CountryCode = "+" + v.CountryCode
			userList[k].OutboundCountryCode = "+" + v.OutboundCountryCode
			if userList[k].Mobile != "" && userList[k].OutboundMobile != "" && userList[k].Mobile == userList[k].OutboundMobile {
				userList[k].OutboundMobile = ""
				userList[k].OutboundCountryCode = ""
			}
			//一次同步一百条
			userItems = append(userItems, userList[k])
			if (k+1)%100 == 0 {
				data, err := json.Marshal(userItems)
				if err != nil {
					msg = "userItems Err:" + err.Error()
					return err
				}
				fmt.Println(k)
				jsonstr := string(data)
				jsonstr = "{\"sync_data\": " + jsonstr + " }"
				SendComapnyToShanghai(url, jsonstr, "user")
				userItems = make([]*models.UserJson, 0)
			}
		}

		//如果剩下还有则同步剩下的部分
		if len(userItems) > 0 {
			data, err := json.Marshal(userItems)
			if err != nil {
				msg = "userItems Err:" + err.Error()
				return err
			}
			jsonstr := string(data)
			jsonstr = "{\"sync_data\": " + jsonstr + " }"
			SendComapnyToShanghai(url, jsonstr, "user")
			companyItems = make([]*models.CompanyJson, 0)
		}
	}
	return
}

func DotongbuShangHaiSendEmail(cont context.Context) (err error) {
	var msg string
	defer func() {
		if err != nil {
			go utils.SendAlarmMsg("发送邮件:同步用户到策略平台信息失败", 2)
			go utils.SendEmail("发送邮件:同步用户到策略平台信息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToExpert)
		}
	}()
	list, err := models.GetCygxShanghaiCompanyLog()
	if err != nil {
		msg = "GetCygxShanghaiCompanyLog Err:" + err.Error()
		return err
	}
	mapErrMsg := make(map[string]string)
	for _, v := range list {
		data := new(GetShangHaiTokenResultApiComPany)
		err := json.Unmarshal([]byte(v.Result), &data)
		if err != nil {
			msg = "GetShangHaiTokenResultApiComPany Err:" + err.Error()
			return err
		}
		if len(data.Data.FailInfo) > 0 {
			for _, vCompany := range data.Data.FailInfo {
				mapErrMsg[vCompany.ErrVal] = vCompany.ErrMsg
			}
		}
	}
	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true
	sheet, err := xlsxFile.AddSheet("上海策略品台同步名单")
	if err != nil {
		return
	}
	//设置宽度
	_ = sheet.SetColWidth(0, 1, 30)
	_ = sheet.SetColWidth(2, 2, 10)
	_ = sheet.SetColWidth(3, 3, 30)

	//标头
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "客户名称"
	cellB := rowTitle.AddCell()
	cellB.Value = "社会信用码"
	cellC := rowTitle.AddCell()
	cellC.Value = "客户类型"
	cellD := rowTitle.AddCell()
	cellD.Value = "错误消息"
	for _, v := range list {
		data := new(models.CompanyUnJsonList)
		err := json.Unmarshal([]byte(v.Body), &data)
		if err != nil {
			msg = "CompanyUnJsonList Err:" + err.Error()
			return err
		}
		if len(data.SyncData) > 0 {
			for _, item := range data.SyncData {
				row := sheet.AddRow()
				cellA := row.AddCell()
				cellA.Value = item.CompanyName
				cellB := row.AddCell()
				cellB.Value = item.CreditCode
				cellC := row.AddCell()
				cellC.Value = item.Fe
				if mapErrMsg[item.CreditCode] != "" {
					cellD := row.AddCell()
					cellD.Value = mapErrMsg[item.CreditCode]
				}
			}
		}
	}
	title := time.Now().Format(utils.FormatDate) + "上海策略品台同步名单"
	content := time.Now().Format(utils.FormatDate) + "上海策略品台同步名单"
	fileName := downLoadnFilePath
	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		return
	}
	if len(list) > 0 {
		utils.SendEmailByHongze(title, content, "cxzhang@hzinsights.com;tshen@hzinsights.com", fileName, title+".xlsx")
	}
	os.Remove(downLoadnFilePath)
	go models.DeleteCygxShanghaiCompanyLog()
	return
}