package pushdata

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"time"

	"github.com/dgrijalva/jwt-go"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/constant"
)

type FieldName struct {
	Name string `json:"name"`
}

type RespData struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

func (resp *RespData) IsOk() bool {
	return resp.Code == 0
}

type Client struct {
	Host      string
	AppSecret string // 调试用 3Oo4dG64X0
	AppKey    string // 调试用 GnAmG4jybB
}

func NewClient() *Client {
	return &Client{
		Host:      constant.PUSH_DATA_HOST,
		AppSecret: constant.PUSH_DATA_APPSECRET,
		AppKey:    constant.PUSH_DATA_APPKEY,
	}
}

func (c *Client) useHeader() (h http.Header) {
	token := jwt.New(jwt.SigningMethodHS256)
	tk, err := token.SignedString([]byte(c.AppSecret))
	if err != nil {
		fmt.Printf("err:%s \n", err)
	}
	h = http.Header{}
	h.Add("x-mmm-accesstoken", tk)
	h.Add("x-mmm-appkey", c.AppKey)
	return
}

type ReqAppendData struct {
	Name   string              `json:"name"`   // 应用表名称
	Fields []FieldName         `json:"fields"` // 应用字段
	Data   []map[string]string `json:"data"`   // 数据
}

// AppendData 追加应用表数据
func (c *Client) AppendData(reqData ReqAppendData) error {
	apiUrl := c.Host + `/api/app-table-file/append-data`
	bodyData, err := json.Marshal(reqData)
	if err != nil {
		return fmt.Errorf("推送数据到字库,追加应用表数据:%s", err)
	}
	req, err := http.NewRequest(http.MethodPost, apiUrl, bytes.NewReader(bodyData))
	if err != nil {
		return fmt.Errorf("推送数据到字库,追加应用表数据:%s", err)
	}
	req.Header = c.useHeader()
	req.Header.Add("Content-Type", "application/json")
	httpClient := http.DefaultClient
	httpClient.Timeout = 60 * time.Second
	resp, err := httpClient.Do(req)
	if err != nil {
		return fmt.Errorf("推送数据到字库,追加应用表数据:%s", err)
	}
	defer resp.Body.Close()
	var respData RespData
	j := json.NewDecoder(resp.Body)
	err = j.Decode(&respData)
	if err != nil {
		return fmt.Errorf("推送数据到字库,追加应用表数据:%s", err)
	}
	if !respData.IsOk() {
		return fmt.Errorf("推送数据到字库,追加应用表数据响应:%s", respData.Msg)
	}
	return nil
}

type ReqSearchTable struct {
	Name string `json:"name"`
}

// SearchTable 查询应用数据表
func (c *Client) SearchTable(name string) {
	apiUrl := `/api/app-table-file/list`
	//TODO
	_ = apiUrl
}

type ReqCreateTable struct {
	Name   string              `json:"name"`   // 应用表名称
	Fields []FieldName         `json:"fields"` // 应用字段
	Data   []map[string]string `json:"data"`
}

// CreateTable 创建应用表
func (c *Client) CreateTable() {
	apiUrl := `/api/app-table-file/create`
	//TODO
	_ = apiUrl
}