package resource_channel

import (
	"bytes"
	"encoding/json"
	"io/ioutil"
	"net/http"
	"net/url"
	"strconv"
	"strings"
	"time"
)

type ResourceAssessment struct {
	ID           uint      `gorm:"primaryKey" json:"id"` // 留学评估表
	DataType     uint8     `json:"data_type"`            // 1.网课 2.api资源 3.专题页 4.工作台录入 5.后台录入 6 小程序
	ChatID       string    `json:"chat_id"`              // 会话id
	Channel      int       `json:"channel"`              // 渠道id
	Category     int       `json:"category"`             // 分类id
	CreatedAt    time.Time `json:"created_at"`           // 数据创建时间
	ReferPageURL string    `json:"refer_page_url"`       // 来源网址
	URL          string    `json:"url"`                  // 落地页地址
	ChatURL      string    `json:"chat_url"`             // 对话发起页
	GrUserId     string    `json:"gr_user_id"`           // 神策distinct_id
}

type ChannelCategory struct {
	Channel  int
	Category int
}

// 渠道归因处理
func GetChannel(assessment ResourceAssessment) ChannelCategory {
	var channel int
	var category int

	if !strings.Contains(assessment.URL, "utm") && !strings.Contains(assessment.ChatURL, "utm") && !strings.Contains(assessment.ReferPageURL, "utm") && (strings.Contains(assessment.ReferPageURL, "daomeng") || strings.Contains(assessment.ChatURL, "daomeng")) {
		channel = 38
		category = 201
	} else if assessment.DataType == 1 {
		channel = 26
		category = 121
	} else if assessment.DataType == 5 || assessment.DataType == 7 {
		channel = assessment.Channel
		category = assessment.Category
	} else if assessment.DataType == 2 {
		if strings.Contains(assessment.URL, "link") {
			channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[1])
			category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[2])
		} else if strings.Contains(assessment.ReferPageURL, "link") {
			channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
			category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
		} else {
			channel = assessment.Channel
			category = assessment.Category
		}
	} else if assessment.DataType == 3 || ((assessment.Channel == 5 || assessment.Channel == 7) && assessment.ChatID != "") {
		if !strings.Contains(assessment.URL, "utm") && !strings.Contains(assessment.ChatURL, "utm") && !strings.Contains(assessment.ReferPageURL, "utm") {
			layout := "2006-01-02 15:04:05"
			startTime := assessment.CreatedAt.Add(-1 * time.Hour)
			start := startTime.Format(layout)
			end := assessment.CreatedAt.Format(layout)
			sql := "select $url from events where distinct_id = '" + assessment.GrUserId + "'and event = '$pageview' and time between '" + start + "' and '" + end + "' order by time limit 1"
			url := getSensorsData(sql)
			if url == "https://www.jjl.cn/" || url == "https://m.jjl.cn/" {
				channel = 7
				category = 126
			} else {
				channel = 5
				category = 11
			}
		} else {
			var PrefixUrl string
			var PrefixReferPageUrl string
			if !strings.Contains(assessment.URL, "https") {
				PrefixUrl = "https://wx.com" + assessment.URL
			}
			if !strings.Contains(assessment.ReferPageURL, "https") {
				PrefixReferPageUrl = "https://wx.com" + assessment.ReferPageURL
			}
			if strings.Contains(PrefixUrl, "link") {
				channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(PrefixUrl, "link")[1], "form")[0], "_")[1])
				category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(PrefixUrl, "link")[1], "form")[0], "_")[2])
			} else if strings.Contains(PrefixReferPageUrl, "link") {
				channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(PrefixReferPageUrl, "link")[1], "form")[0], "_")[1])
				category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(PrefixReferPageUrl, "link")[1], "form")[0], "_")[2])
			} else {
				channel = 7
				category = 126
			}
		}
	} else if assessment.DataType == 4 {
		if strings.Contains(assessment.ChatURL, "link") {
			channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[1])
			category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[2])
		} else if strings.Contains(assessment.ReferPageURL, "link") {
			channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
			category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
		} else {
			channel = 7
			category = 126
		}
	}
	if channel == 0 {
		channel = 5
	}
	if category == 0 {
		channel = 11
	}
	var channelCategory ChannelCategory
	channelCategory.Channel = channel
	channelCategory.Category = category
	return channelCategory
}

// Sensors 神策数据结构体
type Sensors struct {
	Url string `json:"$url"`
}

// 访问神策API
func getSensorsData(sql string) string {
	sensorsUrl := "https://sensorsview.jjl.cn/api/sql/query?token=128d837f466684101710cfb308e7556de975b717c6c2465ba5fc2836d57a64c8&project=production&type=impala&q=" + url.QueryEscape(sql) + "&format=json"
	data := []byte("")
	req, err := http.NewRequest("POST", sensorsUrl, bytes.NewBuffer(data))
	if err != nil {
		return err.Error()
	}
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err.Error()
	}
	defer resp.Body.Close()
	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err.Error()
	}
	var sensors Sensors
	json.Unmarshal([]byte(string(respBody)), &sensors)
	return sensors.Url
}