package services

import (
	"encoding/json"
	"eta/eta_api/services/alarm_msg"
	"eta/eta_api/utils"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

// SendSmsCode 发送国内短信
func SendSmsCode(mobile, vCode, tplId string) (flag bool) {
	if mobile == "" || vCode == "" || tplId == "" {
		return
	}

	var (
		err error
		res string
	)
	defer func() {
		if err != nil {
			tips := fmt.Sprintf("短信验证码发送失败, Err: %s; Result: %s", err.Error(), res)
			utils.FileLog.Info("%s", tips)
			go alarm_msg.SendAlarmMsg(tips, 2)
		}
	}()

	result, e := sendSms(mobile, tplId, vCode)
	if e != nil {
		err = fmt.Errorf("send sms err: %s", e.Error())
		return
	}
	res = string(result)

	var netReturn map[string]interface{}
	if e = json.Unmarshal(result, &netReturn); e != nil {
		err = fmt.Errorf("json unmarshal err: %s", e.Error())
		return
	}
	errCode, ok := netReturn["error_code"].(float64)
	if !ok {
		err = fmt.Errorf("result code err")
		return
	}
	// 忽略错误的手机号码这种错误
	if errCode != 0 && errCode != 205401 {
		err = fmt.Errorf("err code %f", errCode)
		return
	}
	// 发送成功
	if errCode == 0 {
		flag = true
	}
	return
}

// sendSms 发送国内短信
func sendSms(mobile, tplId, code string) (rs []byte, err error) {
	var Url *url.URL
	apiURL := "http://v.juhe.cn/sms/send"
	//初始化参数
	param := url.Values{}
	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
	param.Set("mobile", mobile) //接受短信的用户手机号码
	param.Set("tpl_id", tplId)  //您申请的短信模板ID，根据实际情况修改
	tplVal := fmt.Sprintf(`#code#=%s&#m#=%d`, code, utils.VerifyCodeExpireMinute)
	param.Set("tpl_value", tplVal)     //您设置的模板变量，根据实际情况
	param.Set("key", utils.JhGnAppKey) //应用APPKEY(应用详细页查询)

	Url, err = url.Parse(apiURL)
	if err != nil {
		fmt.Printf("解析url错误:\r\n%v", err)
		return nil, err
	}
	//如果参数中有中文参数,这个方法会进行URLEncode
	Url.RawQuery = param.Encode()
	resp, err := http.Get(Url.String())
	if err != nil {
		fmt.Println("err:", err)
		return nil, err
	}
	defer resp.Body.Close()
	return ioutil.ReadAll(resp.Body)
}

// SendSmsCodeGj 发送国际短信
func SendSmsCodeGj(mobile, vCode, areaNum string) bool {
	flag := false
	result, err := sendSmsGj(mobile, vCode, areaNum)
	if err != nil {
		fmt.Println("发送短信失败")
		return false
	}
	fmt.Println("result", string(result))
	var netReturn map[string]interface{}
	err = json.Unmarshal(result, &netReturn)
	if err != nil {
		//go SendEmail("短信验证码发送失败", "err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
		go alarm_msg.SendAlarmMsg("短信验证码发送失败, Err:"+err.Error()+";Result:"+string(result), 2)
		flag = false
	}
	if netReturn["error_code"].(float64) == 0 {
		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
		flag = true
	} else {
		// 忽略错误的手机号码这种错误
		if netReturn["error_code"].(float64) != 205401 {
			go alarm_msg.SendAlarmMsg("短信验证码发送失败, Result:"+string(result), 2)
		}
		flag = false
	}
	return flag
}

// sendSmsGj 发送国际短信
func sendSmsGj(mobile, code, areaNum string) (rs []byte, err error) {
	var Url *url.URL
	apiURL := "http://v.juhe.cn/smsInternational/send.php"
	//初始化参数
	param := url.Values{}
	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
	param.Set("mobile", mobile)           //接受短信的用户手机号码
	param.Set("tplId", "10054")           //您申请的短信模板ID，根据实际情况修改
	param.Set("tplValue", "#code#="+code) //您设置的模板变量，根据实际情况
	param.Set("key", utils.JhGjAppKey)    //应用APPKEY(应用详细页查询)
	param.Set("areaNum", areaNum)         //应用APPKEY(应用详细页查询)

	Url, err = url.Parse(apiURL)
	if err != nil {
		fmt.Printf("解析url错误:\r\n%v", err)
		return nil, err
	}
	//如果参数中有中文参数,这个方法会进行URLEncode
	Url.RawQuery = param.Encode()
	resp, err := http.Get(Url.String())
	if err != nil {
		fmt.Println("err:", err)
		return nil, err
	}
	utils.FileLog.Info("sendSmsGj:param:" + Url.String())
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	utils.FileLog.Info("sendSmsGj:result:" + string(body))
	return body, err
}
