package service

import (
	"WorldEpcho/src/config"
	"WorldEpcho/src/config/e"
	"bytes"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"io/ioutil"
	"log"
	"mime/multipart"
	"net/http"
)

// TranscriptionSegment 定义一个结构体来匹配JSON中transcription的数组元素
type TranscriptionSegment struct {
	End   float64 `json:"end"`
	Start float64 `json:"start"`
	Text  string  `json:"text"`
}

// TranscriptionResponse 是服务器响应的结构体
type TranscriptionResponse struct {
	Transcription []TranscriptionSegment `json:"transcription"`
}

// TranscribeAudio 用于处理上传的音频文件并调用语音识别接口
func TranscribeAudio(c *gin.Context) {
	/*
	   判断用户是否登录
	*/
	_, isLogin := IsUserLoggedIn(c)
	if !isLogin {
		log.Println("用户未登录")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}

	// 从请求中获取文件
	file, _, err := c.Request.FormFile("file")
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"code": 0, "message": "读取请求文件失败"})
		return
	}
	defer file.Close()

	// 准备发送请求
	url := config.Conf.TranscribeUrl
	fmt.Println(config.ColorBlue, "request url: ", url, config.ColorReset)
	body := &bytes.Buffer{}
	writer := multipart.NewWriter(body)
	part, err := writer.CreateFormFile("file", "filename")
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "创建表单语音文件失败"})
		return
	}
	// 将文件复制到请求体
	_, err = io.Copy(part, file)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "将文件赋值到请求体失败"})
		return
	}

	writer.Close()

	// 发送请求
	fmt.Println(config.ColorCyan, "发送请求...", config.ColorReset)
	request, err := http.NewRequest("POST", url, body)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "发送请求数据失败"})
		return
	}
	request.Header.Set("Content-Type", writer.FormDataContentType())

	client := &http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "请求失败"})
		return
	}
	defer resp.Body.Close()

	// 读取响应
	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "获取响应数据失败"})
		return
	}

	// 解析 JSON 到结构体
	var transResp TranscriptionResponse
	err = json.Unmarshal(respBody, &transResp)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "解析json结构体错误"})
		return
	}
	// 输出结果
	c.JSON(http.StatusOK, gin.H{"code": 1, "message": transResp})
	fmt.Println(config.ColorPurple, "语音转换后响应结果:", config.ColorReset)
	fmt.Println(config.ColorGreen, transResp, config.ColorReset)
}

// TranscribeAudio 用于处理上传的音频文件并调用语音识别接口
func MiGuTranscribeAudio_bak(c *gin.Context) {

	// 从请求头 Authorization 中提取令牌
	tokenString := c.GetHeader("Token")
	if tokenString == "" {
		c.JSON(http.StatusOK, gin.H{"code": e.UnauthorizedStatus, "data": nil, "message": "请求头中无token,或未授权的token访问"})
		return
	}

	// 解析并验证 JWT 令牌
	isValid, err := IsValidMiGuToken(tokenString)
	if err != nil || !isValid {
		c.JSON(http.StatusOK, gin.H{"code": e.InvalidToken, "data": nil, "message": "无效或已过期的令牌"})
		return
	}

	// 从请求中获取文件
	file, _, err := c.Request.FormFile("file")
	if err != nil {
		//400  读取请求文件失败
		c.JSON(http.StatusBadRequest, gin.H{"code": e.InvalidParams, "data": nil, "message": "读取请求音频文件失败"})
		return
	}
	defer file.Close()

	// 准备发送请求
	url := config.Conf.TranscribeUrl
	fmt.Println(config.ColorBlue, "request url: ", url, config.ColorReset)
	body := &bytes.Buffer{}
	writer := multipart.NewWriter(body)
	part, err := writer.CreateFormFile("file", "filename")
	if err != nil {
		//500 创建表单语音文件失败
		fmt.Printf("创建表单语音文件失败 ", err.Error())
		c.JSON(http.StatusInternalServerError, gin.H{"code": e.InternalError, "data": nil, "message": "创建表单语音文件失败"})
		return
	}
	// 将文件复制到请求体
	_, err = io.Copy(part, file)
	if err != nil {
		//500 将文件赋值到请求体失败
		c.JSON(http.StatusInternalServerError, gin.H{"code": e.InternalError, "data": nil, "message": "将文件赋值到请求体失败"})
		return
	}

	writer.Close()

	// 发送请求
	fmt.Println(config.ColorCyan, "发送请求...", config.ColorReset)
	request, err := http.NewRequest("POST", url, body)
	if err != nil {
		//500 发送请求数据失败
		c.JSON(http.StatusInternalServerError, gin.H{"code": e.InternalError, "data": nil, "message": "发送请求数据失败"})
		return
	}
	request.Header.Set("Content-Type", writer.FormDataContentType())

	client := &http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		//500 请求失败
		c.JSON(http.StatusOK, gin.H{"code": e.InternalError, "data": nil, "message": "请求失败"})
		return
	}
	defer resp.Body.Close()

	// 读取响应
	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": e.InternalError, "data": nil, "message": "获取响应数据失败"})
		return
	}

	// 解析 JSON 到结构体
	var transResp TranscriptionResponse
	err = json.Unmarshal(respBody, &transResp)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": e.InternalError, "data": nil, "message": "解析json结构体错误"})
		return
	}

	// 将所有的text片段合并为一个字符串
	var fullTranscript string
	for _, segment := range transResp.Transcription {
		fullTranscript += segment.Text + "。 "
	}
	fmt.Println("fullTranscript ==> ", fullTranscript)
	// 使用 mahonia 将繁体字转换为简体字
	/*
	     var simplifiedTranscript string
	     decoder := mahonia.NewDecoder("zh_CN") // 使用简体中文编码
	   	if decoder == nil {
	   		c.JSON(http.StatusInternalServerError, gin.H{"code": e.InternalError, "data": nil, "message": "字符编码转换器初始化失败"})
	   		return
	   	}
	   	if fullTranscript == "" {
	   		c.JSON(http.StatusInternalServerError, gin.H{"code": e.InternalError, "data": nil, "message": "转换的文本为空"})
	   		return
	   	}
	   	simplifiedTranscript = decoder.ConvertString(fullTranscript)
	   	fmt.Println("simplifiedTranscript ==> ", simplifiedTranscript)
	*/

	// 输出结果
	c.JSON(http.StatusOK, gin.H{
		"code": e.SUCCESS,
		"data": gin.H{
			"fullSpeechParse": fullTranscript,
		},
		"message": "语音解析成功",
	})

	fmt.Println(config.ColorPurple, "语音转换后响应结果:", config.ColorReset)
	fmt.Println(config.ColorGreen, fullTranscript, config.ColorReset)

}

func MiGuTranscribeAudio(c *gin.Context) {

	// 从请求头 Authorization 中提取令牌
	tokenString := c.GetHeader("Token")
	if tokenString == "" {
		c.JSON(http.StatusOK, gin.H{"code": e.UnauthorizedStatus, "data": nil, "message": "请求头中无token,或未授权的token访问"})
		return
	}

	// 解析并验证 JWT 令牌
	isValid, err := IsValidMiGuToken(tokenString)
	if err != nil || !isValid {
		c.JSON(http.StatusOK, gin.H{"code": e.InvalidToken, "data": nil, "message": "无效或已过期的令牌"})
		return
	}

	// 从请求中获取文件
	file, fileHeader, err := c.Request.FormFile("file")
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"code": e.InvalidParams, "data": nil, "message": "读取请求音频文件失败"})
		return
	}
	defer file.Close()

	// 准备发送请求
	url := config.Conf.TranscribeUrl
	fmt.Println(config.ColorBlue, "request url: ", url, config.ColorReset)
	body := &bytes.Buffer{}
	writer := multipart.NewWriter(body)
	part, err := writer.CreateFormFile("file", fileHeader.Filename)
	if err != nil {
		fmt.Printf("创建表单语音文件失败: %v", err)
		c.JSON(http.StatusInternalServerError, gin.H{"code": e.InternalError, "data": nil, "message": "创建表单语音文件失败"})
		return
	}

	// 将文件复制到请求体
	_, err = io.Copy(part, file)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": e.InternalError, "data": nil, "message": "将文件赋值到请求体失败"})
		return
	}
	writer.Close()

	// 发送请求
	request, err := http.NewRequest("POST", url, body)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": e.InternalError, "data": nil, "message": "发送请求数据失败"})
		return
	}

	// 设置请求头
	request.Header.Set("Content-Type", writer.FormDataContentType())

	// 打印请求参数
	fmt.Println("请求参数:")
	fmt.Println("URL:", url)
	fmt.Println("Headers:", request.Header)
	fmt.Println("Token:", tokenString)
	fmt.Println("File Name:", fileHeader.Filename)

	client := &http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": e.InternalError, "data": nil, "message": "请求失败"})
		return
	}
	defer resp.Body.Close()

	// 读取响应
	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": e.InternalError, "data": nil, "message": "获取响应数据失败"})
		return
	}

	// 解析 JSON 到结构体
	var transResp TranscriptionResponse
	err = json.Unmarshal(respBody, &transResp)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": e.InternalError, "data": nil, "message": "解析json结构体错误"})
		return
	}

	// 将所有的text片段合并为一个字符串
	var fullTranscript string
	for _, segment := range transResp.Transcription {
		fullTranscript += segment.Text + "。 "
	}
	fmt.Println("fullTranscript ==> ", fullTranscript)

	// 输出结果
	c.JSON(http.StatusOK, gin.H{
		"code": e.SUCCESS,
		"data": gin.H{
			"fullSpeechParse": fullTranscript,
		},
		"message": "语音解析成功",
	})

	fmt.Println(config.ColorPurple, "语音转换后响应结果:", config.ColorReset)
	fmt.Println(config.ColorGreen, fullTranscript, config.ColorReset)
}
