/**
  @author: yaoyuliang
  @date: 2023/8/1
**/
package saas_file

import (
	"errors"
	"gin-vue-admin/models"
	"gin-vue-admin/utils"
	"io/ioutil"
	"net/http"
	"net/url"
)

var LOCAL_SAAS_FILE *SaasFile

func init() {
	LOCAL_SAAS_FILE = new(SaasFile)
	LOCAL_SAAS_FILE.RootAddress = "https://sanswer.pet-dbc.cn"
	LOCAL_SAAS_FILE.GetTokenFile = "/api/user/login?info="
}

type SaasFile struct {
	XToken       string
	RootAddress  string
	GetTokenFile string
}

type Header struct {
	Key   string `json:"key"`
	Value string `json:"value"`
}

func (c *SaasFile) GetInfo(chainCode, hospitalCode, consumerId string) string {
	info := utils.GetEncryptDes(chainCode + "|" + hospitalCode + "|" + consumerId)
	return url.QueryEscape(info)
}

func (c *SaasFile) GetSaasFileToken(chainCode, hospitalCode, consumerId string) error {

	body, err := ToRequest(http.MethodGet, c.RootAddress+c.GetTokenFile+c.GetInfo(chainCode, hospitalCode, consumerId), nil)
	if err != nil {
		return err
	}

	reply := new(models.QuestionLogin)
	utils.UnserislizeJson(string(body), reply)

	if reply.Code == 0 {
		c.XToken = reply.Data.Token
	}
	return nil

}

func ToRequest(method, urlStr string, headers []*Header) ([]byte, error) {

	req, err := http.NewRequest(method, urlStr, nil)
	if err != nil {
		return nil, err
	}

	for _, v := range headers {
		req.Header.Add(v.Key, v.Value)
	}

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}

	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	if resp.StatusCode != http.StatusOK {
		return nil, errors.New(" unknown error ")
	}
	return body, nil
}

func (c *SaasFile) ToPreviewFile(chainCode, hospitalCode, consumerId, petId string) (interface{}, error) {

	err := c.GetSaasFileToken(chainCode, hospitalCode, consumerId)
	if err != nil {
		return nil, err
	}

	headers := make([]*Header, 0)
	headers = append(headers, &Header{Key: "xtoken", Value: c.XToken})

	body, err := ToRequest(http.MethodGet, c.RootAddress+"/api/file/preview?show=1&pet_id="+petId, headers)
	if err != nil {
		return nil, err
	}

	reply := new(models.SaasFileCurrency)
	utils.UnserislizeJson(string(body), reply)

	if reply.Code == 0 {
		return reply.Data, nil
	}

	return nil, nil

}
