package openapi

import (
	"encoding/json"
	"fmt"
	"oppmg/common/log"
	"oppmg/models"
	"oppmg/protocol"
	"oppmg/utils/signature"
	"strconv"

	"github.com/astaxie/beego"
)

type OpenApiController struct {
	beego.Controller
}

func (this *OpenApiController) ResposeJson(msg *protocol.ResponseMessage) {
	this.Data["json"] = msg
	this.ServeJSON()
}

//Finish 实现beego.ControllerInterface 的接口
func (this *OpenApiController) Finish() {
	strByte, _ := json.Marshal(this.Data["json"])
	length := len(strByte)
	if length > 1000 {
		log.Info(fmt.Sprintf("<====Send to client:  RspBodyData: %s......", string(strByte[:1000])))
	} else {
		log.Info(fmt.Sprintf("<====Send to client: RspBodyData: %s", string(strByte)))
	}

}

//Prepare 实现beego.ControllerInterface 的接口
func (this *OpenApiController) Prepare() {
	this.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Origin", "*")
	this.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Headers", "*")
	if this.Ctx.Input.Method() == "OPTIONS" {
		this.Ctx.ResponseWriter.WriteHeader(204)
		this.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
		this.Ctx.WriteString("")
		return
	}
	return
}

//GetChangeMedia 获取机会的图片、音频、视频的地址
//@router /common/chance/media
func (c *OpenApiController) GetChangeMedia() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		ChanceId string `json:"chance_id"`
		CheckSum string `json:"check_sum"`
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	if ok := signature.CheckSignaString(param.ChanceId, param.CheckSum); !ok {
		log.Error("签名check_sum比对失败")
		msg = protocol.BadRequestParam("1")
		return
	}
	chanceId, _ := strconv.ParseInt(param.ChanceId, 10, 64)
	var (
		err          error
		chanceData   *models.ChanceData
		imageData    []models.ChanceDataImage
		speedchsData []models.ChanceDataSpeechs
		videosData   []models.ChanceDataVideos
		chance       *models.Chance
		chanceSource []protocol.InputElement
	)
	chanceData, err = models.GetChanceDataByChanceId(chanceId)
	rsp := map[string]interface{}{}
	rspOrther := []map[string]interface{}{}
	if err != nil {
		msg = protocol.NewReturnResponse(rsp, nil)
		return
	}
	chance, err = models.GetChanceById(chanceId)
	if err != nil {
		msg = protocol.NewReturnResponse(rsp, nil)
		return
	}
	json.Unmarshal([]byte(chance.SourceContent), &chanceSource)
	json.Unmarshal([]byte(chanceData.Images), &imageData)
	json.Unmarshal([]byte(chanceData.Speechs), &speedchsData)
	json.Unmarshal([]byte(chanceData.Videos), &videosData)
	videoMapData := []map[string]interface{}{}
	for i := range videosData {
		m := map[string]interface{}{
			"path": videosData[i].Path,
			"cover": map[string]string{
				"path": videosData[i].Cover.Path,
			},
		}
		videoMapData = append(videoMapData, m)
	}
	rspOrther = append(rspOrther, map[string]interface{}{
		"type": 1, "data": videoMapData,
	})

	imgMapData := []map[string]interface{}{}
	for i := range imageData {
		m := map[string]interface{}{
			"path": imageData[i].Path,
		}
		imgMapData = append(imgMapData, m)
	}
	rspOrther = append(rspOrther, map[string]interface{}{
		"type": 2, "data": imgMapData,
	})
	speedchMapData := []map[string]interface{}{}
	for i := range speedchsData {
		m := map[string]interface{}{
			"path": speedchsData[i].Path,
		}
		speedchMapData = append(speedchMapData, m)
	}
	rspOrther = append(rspOrther, map[string]interface{}{
		"type": 3, "data": speedchMapData,
	})
	rspChanceData := []map[string]interface{}{}
	for i := range chanceSource {
		if chanceSource[i].InputType != models.InputTypeImageVedio {
			continue
		}
		imageVideo := []map[string]interface{}{}
		for ii := range chanceSource[i].Data {
			m := map[string]interface{}{
				"type":  chanceSource[i].Data[ii].Type,
				"path":  chanceSource[i].Data[ii].Path,
				"cover": chanceSource[i].Data[ii].Cover,
			}
			imageVideo = append(imageVideo, m)
		}
		chanceData := map[string]interface{}{
			"lable": chanceSource[i].Label,
			"data":  imageVideo,
		}
		rspChanceData = append(rspChanceData, chanceData)
	}
	rsp["other"] = rspOrther
	rsp["chance_data"] = rspChanceData
	msg = protocol.NewReturnResponse(rsp, nil)
	return

}