package stt

import (
	"encoding/json"
	"strings"
	"time"

	"gitlab.com/cinnamon/voiceagent/icserror"
	"gitlab.com/cinnamon/voiceagent/icslog"
	"gitlab.com/cinnamon/voiceagent/icsws"
)

type LGSTTParam struct {
	UserName       string `json:"USERNAME"`
	UpdateInternal int    `json:"UPDATEINTERVAL"`
	EPDProcess     string `json:"EPD_PROCESS"`
	ClinetType     string `json:"CLIENT_TYPE"`
}

func sttLG(voicedata []byte) (string, *icserror.IcsError) {
	var trstring string
	l := icslog.GetIcsLog()

	voicedataLen := len(voicedata)
	startPos := 0
	endPos := 8000

	ws := icsws.NewWSClient("18.183.222.16:9998", "")
	werr := ws.Connect()
	if werr != nil {
		l.Printf(icslog.LOG_LEVEL_ERROR, -1, "Failed to connect to LG STT Websocket server[18.183.222.16:9998] - %s", werr.GetError())
		icserror.ICSERRSTTFail.SetError(werr.GetError())
		return "", icserror.ICSERRSTTFail
	}
	sttParam := LGSTTParam{
		UserName:       "LGECS",
		UpdateInternal: -1,
		EPDProcess:     "FALSE",
		ClinetType:     "APPLICATION",
	}
	param, jerr := json.Marshal(sttParam)
	if jerr != nil {
		l.Printf(icslog.LOG_LEVEL_ERROR, -1, "Failed to json marshal - %s", jerr)
		icserror.ICSERRSTTFail.SetError(jerr)
		return "", icserror.ICSERRSTTFail
	}
	werr = ws.WriteData(param)
	if werr != nil {
		l.Printf(icslog.LOG_LEVEL_ERROR, -1, "Failed to send to LG STT Websocket server[18.183.222.16:9998] - %s", werr.GetError())
		icserror.ICSERRSTTFail.SetError(werr.GetError())
		return "", icserror.ICSERRSTTFail
	}

	for {
		data, rerr := ws.Read()
		if rerr != nil {
			l.Printf(icslog.LOG_LEVEL_ERROR, -1, "Failed to read to LG STT Websocket server[18.183.222.16:9998] - %s", rerr.GetError())
			break
		}
		command := string(data)
		if strings.Compare(command, "DATA") == 0 {
			for {
				if endPos < voicedataLen {
					ws.WriteData(voicedata[startPos:endPos])
					startPos += 8000
					endPos += 8000
				} else {
					ws.WriteData(voicedata[startPos:voicedataLen])
					ws.Write("ENDOFSPEECH")
					break
				}
			}
		} else if strings.Contains(command, "RESULT:") {
			ws.Write("STOPLISTENING")
			//tr := strings.SplitN(command, "RESULT:", 2)[1]
			//trstring = tr[:len(tr)-1]
			trstring = strings.SplitN(command, "RESULT:", 2)[1]
		} else if strings.Contains(command, "MESSAGE:") {
			//tr := strings.SplitN(command, "MESSAGE:", 2)[1]
			//trstring = tr[:len(tr)-1]
			trstring = strings.SplitN(command, "MESSAGE:", 2)[1]
		} else if strings.Compare(command, "STOPLISTENING") == 0 {
			time.Sleep(time.Millisecond * 100)
			break
		}
	}

	return trstring, icserror.ICSERRSTTOK
}