package icshttp

import (
	"crypto/rand"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"math/big"
	"net/http"
	"strings"
	"sync"
	"time"

	"gitlab.com/cinnamon/voiceagent/icsconf"
	"gitlab.com/cinnamon/voiceagent/icslog"
	"gitlab.com/cinnamon/voiceagent/icspacketer"
	"gitlab.com/cinnamon/voiceagent/icspacketparser"
)

const HANDLE_NUM = 1024

const (
	TTS_FUNC1 = iota
	TTS_FUNC2
	TTS_FUNC3
	TTS_FUNC4
	BOT_FUNC
)

type Handler struct {
	r *Router
}

type handleInfo struct {
	id      int
	method  string
	pattern string
	h       http.HandlerFunc
}

type Request struct {
	Token          string          `json:"token"`
	OprMngCode     string          `json:"oprMngCode"`
	Method         string          `json:"method"`
	TalkText       string          `json:"talkText"`
	CallId         string          `json:"callId"`
	TrunkGroup     string          `json:"trunkGroup"`
	TelNo          string          `json:"telNo"`
	Dnis           string          `json:"dnis"`
	MentType       string          `json:"mentType"`
	RecordFilePath string          `json:"recordFilePath"`
	ServerID       string          `json:"serverId"`
	ServerIP       string          `json:"serverIp"`
	Data           json.RawMessage `json:"data"`
}

type TransLateInfo struct {
	Use   bool   `json:"use"`
	Token string `json:"token"`
	Text  string `json:"text"`
	Lang  string `json:"lang"`
}

type Response struct {
	ResultCode       int     `json:"resultCode"`
	Token            string  `json:"token"`
	Action           string  `json:"action"`
	AnounceMents     string  `json:"announceMents"`
	AnnounceFilePath string  `json:"announceFilePath"`
	Data             ResData `json:"DATA"`
}

type ResData struct {
	BargeIn      string          `json:"bargeIn"`
	RecodingFile string          `json:"recodingFile"`
	SttMaxTime   int             `json:"sttMaxTime"`
	MaxDigit     int             `json:"maxDigit"`
	MinDigit     int             `json:"minDigit"`
	DigitTerm    int             `json:"digitTerm"`
	TelNo        string          `json:"telNo"`
	VoiceName    string          `json:"voiceName"`
	Speed        string          `json:"speed"`
	Volume       string          `json:"volume"`
	Pitch        string          `json:"pitch"`
	EndCharacter []string        `json:"endCharacter"`
	MaxWaitTime  int             `json:"maxNoInputTime"`
	UUI          json.RawMessage `json:"uui"`
}

type ResStatus struct {
	Count         int
	Status        string
	NotUnderstand int
	PreEventNum   int
	PreEventNum2  int
	LoopCount     int
	TransLateText string
}

type ScenarioSession struct {
	session map[string]ResStatus
	m       *sync.Mutex
}

// var scenarioSession map[string]ResStatus

var handles []*handleInfo
var session []*ScenarioSession
var tokenMap map[string]string

func init() {
	handles = make([]*handleInfo, HANDLE_NUM)
	// session := make(map[string]ResStatus) // session init
	scenarioSession := new(ScenarioSession)
	scenarioSession.session = make(map[string]ResStatus, 200)
	scenarioSession.m = &sync.Mutex{}
	// session = make(map[string]ResStatus) // session init

	//TTS
	handles[TTS_FUNC1] = &handleInfo{method: "GET", pattern: "/tts/1", h: TTSFunc1}
	handles[TTS_FUNC2] = &handleInfo{method: "GET", pattern: "/tts/2", h: TTSFunc2}
	handles[TTS_FUNC3] = &handleInfo{method: "POST", pattern: "/tts/3", h: TTSFunc3}
	handles[TTS_FUNC4] = &handleInfo{method: "POST", pattern: "/tts/4", h: TTSFunc4}

	// bot sinario
	handles[BOT_FUNC] = &handleInfo{method: "POST", pattern: "/platform/api/call/process", h: scenarioSession.BOTPFunc}
}

func BuildHandler(r *Router) {
	for iter, handle := range handles {
		if handle != nil {
			//fmt.Println(handle)
			handle.id = iter
			r.HandleFunc(handle.method, handle.pattern, handle.h)
		} else {
			break
		}
	}
}

/////////////////////////////////////////////
//TTS

func TTSFunc1(w http.ResponseWriter, r *http.Request) {
	h := icspacketparser.NewHTTP()
	err := icspacketer.PutPacket(r, &h)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Fprintln(w, "TTS func 1", r)
}

func TTSFunc2(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "TTS func 2", r)
}

//post
func TTSFunc3(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "TTS func 3", r)
	body := make([]byte, r.ContentLength)
	r.Body.Read(body)
	fmt.Println("TTS func 3", r.Method, r.URL)
	for iter, v := range r.Header {
		fmt.Println(iter, v)
	}
	fmt.Println(string(body))
}

//post
func TTSFunc4(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "TTS func 4", r)
}

func (s *ScenarioSession) GetSession(token string) ResStatus {
	s.m.Lock()
	defer s.m.Unlock()
	resStatus := s.session[token]

	return resStatus
}

func (s *ScenarioSession) UpdateSession(token string, data ResStatus) {
	s.m.Lock()
	defer s.m.Unlock()
	s.session[token] = data
}

func (s *ScenarioSession) GetScnario(dnis string, count int) icsconf.ScenarioConfig {
	s.m.Lock()
	defer s.m.Unlock()

	conf := icsconf.GetIcsConfig()
	resultConfig := conf.ScenarioConfig[dnis][count]

	return resultConfig
}

/////////////////////////////////////////////
//BOT
func (s *ScenarioSession) BOTPFunc(w http.ResponseWriter, r *http.Request) {
	// get scenario config
	l := icslog.GetIcsLog()
	conf := icsconf.GetIcsConfig()
	scnarioConf := conf.ScenarioConfig
	// Request json parsing
	request := Request{}
	resBody, err := ioutil.ReadAll(r.Body)
	if err != nil {
		fmt.Println(err)
	}
	defer r.Body.Close()

	err = json.Unmarshal(resBody, &request)
	if err != nil {
		l.Printf(icslog.LOG_LEVEL_INFO, -1, "response unmarshal error!!!!! ")
	}

	agent := strings.SplitN(request.CallId, "@", 2)
	l.Printf(icslog.LOG_LEVEL_INFO, -1, ">>>>>> DATA INFO - method [%s], agent [%s], token [%s] talk[%s]", request.Method, agent, request.Token, request.TalkText)

	response := new(Response)
	dnis := request.Dnis

	var translateinfo TransLateInfo
	err = json.Unmarshal([]byte(request.Data), &translateinfo)
	if err != nil {
		return
	}

	if request.Method == "HANGUP" {
		response.ResultCode = 200
		response.Token = request.Token
		response.Action = ""
		response.AnounceMents = ""
		response.Data.BargeIn = ""
		response.Data.RecodingFile = ""
		response.Data.SttMaxTime = 10
	} else if (request.Method != "INIT" && request.TalkText == "") || (request.Method != "INIT" && translateinfo.Use) {
		response.ResultCode = 200
		response.Token = request.Token

		scenario := s.GetScnario(dnis, 2)

		response.Action = scenario.Action
		response.AnounceMents = scenario.AnounceMents
		response.AnnounceFilePath = scenario.AudioFilePath
		response.Data.Speed = fmt.Sprintf("%d", scenario.Speed)
		// response.Data.VoiceName = scenario.VoiceName
		response.Data.VoiceName = fmt.Sprintf("%d", scenario.VoiceName)
		response.Data.Volume = fmt.Sprintf("%d", scenario.Volume)
		response.Data.Pitch = fmt.Sprintf("%d", scenario.Pitch)
		response.Data.MaxWaitTime = scenario.MaxWaitTime
		response.Data.BargeIn = scenario.BargeIn
		response.Data.SttMaxTime = scenario.SttMaxTime
		response.Data.MaxDigit = scenario.MaxDigit
		response.Data.RecodingFile = "Y"

		// fmt.Println("-------------------------")
		// fmt.Printf("lv 0 => %#v\n", translateinfo)
		// fmt.Printf("lv 1 =>%#v\n", request)
		// fmt.Printf("lv 2 =>%#v\n", response)
		// fmt.Println("-------------------------")

		if translateinfo.Use {
			srcSession := s.GetSession(request.Token)
			dstSession := s.GetSession(translateinfo.Token)
			if request.TalkText != "" {
				dstRlt := ResStatus{Count: dstSession.Count + 1, TransLateText: request.TalkText}
				s.UpdateSession(translateinfo.Token, dstRlt)
			}

			if srcSession.TransLateText != "" {
				response.AnounceMents = srcSession.TransLateText
				srcRlt := ResStatus{Count: srcSession.Count + 1, Status: scenario.Action, TransLateText: scenario.AnounceMents}
				s.UpdateSession(request.Token, srcRlt)
			}

			l.Printf(icslog.LOG_LEVEL_INFO, -1, "STT %s   | TTS %s", request.TalkText, response.AnounceMents)
		}
	} else {
		switch request.Method {
		case "INIT":
			scenario := s.GetScnario(dnis, 1)
			token := createToken(request.CallId)
			response.ResultCode = 200
			response.Token = token
			response.Action = scenario.Action
			response.AnounceMents = scenario.AnounceMents
			response.Data.Speed = fmt.Sprintf("%d", scenario.Speed)
			response.Data.VoiceName = fmt.Sprintf("%d", scenario.VoiceName)
			response.Data.Volume = fmt.Sprintf("%d", scenario.Volume)
			response.Data.Pitch = fmt.Sprintf("%d", scenario.Pitch)
			response.Data.MaxWaitTime = scenario.MaxWaitTime
			response.Data.BargeIn = scenario.BargeIn
			response.Data.SttMaxTime = scenario.SttMaxTime
			response.Data.MaxDigit = scenario.MaxDigit
			response.Data.RecodingFile = "Y"

			if translateinfo.Token != "" {
				response.AnounceMents = "고객 연결 성공"
			} else {
				s.session[token] = ResStatus{Count: 1, Status: scnarioConf[dnis][0].Action, NotUnderstand: 0, PreEventNum: 1}
			}
		}
	}

	response.Data.UUI = json.RawMessage{}
	uuiMap := map[string]interface{}{
		"test1": "testdata1231",
		"test2": 123,
		"test3": 0.1,
	}

	// 맵을 JSON으로 마샬링
	uuiJSON, err := json.Marshal(uuiMap)
	if err != nil {
		fmt.Println("Error marshaling UUI:", err)
		return
	}

	// 마샬링된 JSON을 json.RawMessage로 변환
	response.Data.UUI = json.RawMessage(uuiJSON)
	response.Data.TelNo = request.TelNo
	// s.m.Unlock()
	// // response marshal

	resMarshal, jerr := json.Marshal(response)
	if jerr != nil {
		fmt.Println("Json Marshal error ", jerr)
	}
	l.Printf(icslog.LOG_LEVEL_INFO, -1, "Send Message\n %s", string(resMarshal))
	l.Printf(icslog.LOG_LEVEL_INFO, -1, "Send From %s\n", request.TelNo)

	fmt.Fprintln(w, string(resMarshal))

}

// func (s *ScenarioSession) BOTPFunc(w http.ResponseWriter, r *http.Request) {
// 	// get scenario config
// 	l := icslog.GetIcsLog()
// 	conf := icsconf.GetIcsConfig()
// 	scnarioConf := conf.ScenarioConfig
// 	// Request json parsing
// 	request := Request{}
// 	resBody, err := ioutil.ReadAll(r.Body)
// 	if err != nil {
// 		fmt.Println(err)
// 	}
// 	defer r.Body.Close()

// 	err = json.Unmarshal(resBody, &request)
// 	if err != nil {
// 		l.Printf(icslog.LOG_LEVEL_INFO, -1, "response unmarshal error!!!!! ")
// 	}

// 	agent := strings.SplitN(request.CallId, "@", 2)
// 	fmt.Printf(">>>>>> DATA INFO - method [%s], agent [%s], token [%s]\n", request.Method, agent, request.Token)
// 	l.Printf(icslog.LOG_LEVEL_INFO, -1, ">>>>>> DATA INFO - method [%s], agent [%s], token [%s] talk[%s]", request.Method, agent, request.Token, request.TalkText)

// 	response := new(Response)
// 	dnis := request.Dnis

// 	s.m.Lock()

// 	var translateinfo TransLateInfo
// 	err = json.Unmarshal([]byte(request.Data), &translateinfo)
// 	if err != nil {
// 		return
// 	}

// 	if request.Method == "HANGUP" {
// 		response.ResultCode = 200
// 		response.Token = request.Token
// 		response.Action = ""
// 		response.AnounceMents = ""
// 		response.Data.BargeIn = ""
// 		response.Data.RecodingFile = ""
// 		response.Data.SttMaxTime = 10
// 	} else if (request.Method != "INIT" && request.TalkText == "") || (request.Method != "INIT" && translateinfo.Use) {
// 		if dnis == "AISB" || dnis == "07075999956" || dnis == "821462" || dnis == "1462" {
// 			dnis = "9013"
// 		}

// 		// if dnis != "07012345678" && dnis != "07077442711" {
// 		// 	dnis = "sim"
// 		// }

// 		if dnis == "07012345678" || dnis == "07077442711" {
// 			dnis = "sim3"
// 		}

// 		if dnis == "9012" {
// 			response.ResultCode = 200
// 			response.Token = request.Token
// 			response.Action = scnarioConf[dnis][s.session[request.Token].Count+1].Action
// 			response.AnounceMents = scnarioConf[dnis][s.session[request.Token].Count+1].AnounceMents
// 			if s.session[request.Token].Count != 0 && dnis == "9012" {
// 				response.AnounceMents = strings.ReplaceAll(response.AnounceMents, "$", request.TalkText)
// 			}
// 			response.Data.Speed = scnarioConf[dnis][s.session[request.Token].Count+1].Speed
// 			response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].Count+1].VoiceName
// 			response.Data.Volume = scnarioConf[dnis][s.session[request.Token].Count+1].Volume
// 			response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].Count+1].Pitch
// 			response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].Count+1].MaxWaitTime
// 			response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].Count+1].BargeIn
// 			response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].Count+1].SttMaxTime
// 			response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].Count+1].MaxDigit
// 			response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].Count+1].EndCharacter}
// 			response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count+1].DigitTerm
// 			response.Data.RecodingFile = "Y"

// 			s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count+1].Action}
// 		} else {
// 			response.ResultCode = 200
// 			response.Token = request.Token
// 			response.Action = scnarioConf[dnis][2].Action
// 			response.AnounceMents = scnarioConf[dnis][2].AnounceMents
// 			response.AnnounceFilePath = scnarioConf[dnis][2].AudioFilePath
// 			response.Data.Speed = scnarioConf[dnis][2].Speed
// 			response.Data.VoiceName = scnarioConf[dnis][2].VoiceName
// 			response.Data.Volume = scnarioConf[dnis][2].Volume
// 			response.Data.Pitch = scnarioConf[dnis][2].Pitch
// 			response.Data.MaxWaitTime = scnarioConf[dnis][2].MaxWaitTime
// 			response.Data.BargeIn = scnarioConf[dnis][2].BargeIn
// 			response.Data.SttMaxTime = scnarioConf[dnis][2].SttMaxTime
// 			response.Data.MaxDigit = scnarioConf[dnis][2].MaxDigit
// 			response.Data.EndCharacter = []string{scnarioConf[dnis][2].EndCharacter}
// 			response.Data.DigitTerm = scnarioConf[dnis][2].DigitTerm
// 			response.Data.RecodingFile = "Y"

// 			fmt.Println("-------------------------")
// 			fmt.Printf("lv 0 => %#v\n", translateinfo)
// 			fmt.Printf("lv 1 =>%#v\n", request)
// 			fmt.Printf("lv 2 =>%#v\n", response)
// 			fmt.Println("-------------------------")

// 			if translateinfo.Use {
// 				if request.TalkText != "" {
// 					s.session[translateinfo.Token] = ResStatus{Count: s.session[translateinfo.Token].Count + 1, TransLateText: request.TalkText}
// 				}

// 				if s.session[request.Token].TransLateText != "" {
// 					response.Action = "STT"
// 					response.AnounceMents = s.session[request.Token].TransLateText
// 					response.Data.SttMaxTime = 15
// 					response.Data.MaxWaitTime = 30
// 					s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][2].Action, TransLateText: scnarioConf[dnis][2].AnounceMents}
// 				}
// 			} else {
// 				s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][2].Action, TransLateText: scnarioConf[dnis][2].AnounceMents}
// 			}

// 		}
// 	} else {
// 		fmt.Println("RECV METHOD")
// 		fmt.Println(dnis)

// 		// if dnis == "AISB" || dnis == "07075999956" || dnis == "821462" || dnis == "1462" {
// 		// 	dnis = "9013"
// 		// }
// 		fmt.Println(dnis)
// 		// if dnis == "9012" || dnis == "07012345678" || dnis == "07077442711" {
// 		// 	dnis = "sim3"
// 		// }

// 		// if dnis == "9013" {
// 		// 	dnis = "9014"
// 		// }

// 		switch request.Method {
// 		case "INIT":
// 			token := createToken(request.CallId)
// 			response.ResultCode = 200
// 			response.Token = token
// 			response.Action = scnarioConf[dnis][s.session[request.Token].Count+1].Action
// 			response.AnounceMents = scnarioConf[dnis][s.session[request.Token].Count+1].AnounceMents
// 			response.Data.Speed = scnarioConf[dnis][s.session[request.Token].Count+1].Speed
// 			response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].Count+1].VoiceName
// 			response.Data.Volume = scnarioConf[dnis][s.session[request.Token].Count+1].Volume
// 			response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].Count+1].Pitch
// 			response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].Count+1].MaxWaitTime
// 			response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].Count+1].BargeIn
// 			response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].Count+1].SttMaxTime
// 			response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].Count+1].MaxDigit
// 			response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].Count+1].EndCharacter}
// 			response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count+1].DigitTerm
// 			response.AnnounceFilePath = scnarioConf[dnis][s.session[request.Token].Count+1].AudioFilePath
// 			response.Data.RecodingFile = "Y"
// 			if translateinfo.Token != "" {
// 				response.AnounceMents = "고객 연결 성공"
// 			} else {
// 				s.session[token] = ResStatus{Count: 1, Status: scnarioConf[dnis][0].Action, NotUnderstand: 0, PreEventNum: 1}
// 			}
// 		case "STT", "DTMF", "BOTH", "MEMO", "NONE":
// 			response.ResultCode = 200
// 			response.Token = request.Token
// 			if dnis == "9013" || dnis == "9014" {
// 				response.Action = scnarioConf[dnis][s.session[request.Token].Count+1].Action
// 				response.AnounceMents = scnarioConf[dnis][s.session[request.Token].Count+1].AnounceMents
// 				response.Data.Speed = scnarioConf[dnis][s.session[request.Token].Count+1].Speed
// 				response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].Count+1].VoiceName
// 				response.Data.Volume = scnarioConf[dnis][s.session[request.Token].Count+1].Volume
// 				response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].Count+1].Pitch
// 				response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].Count+1].MaxWaitTime
// 				response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].Count+1].BargeIn
// 				response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].Count+1].SttMaxTime
// 				response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].Count+1].MaxDigit
// 				response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].Count+1].EndCharacter}
// 				response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count+1].DigitTerm
// 				response.AnnounceFilePath = scnarioConf[dnis][s.session[request.Token].Count+1].AudioFilePath

// 				response.Data.RecodingFile = "Y"
// 				s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count+1].Action}
// 				//	s.m.Unlock()
// 			} else if dnis == "9012" {
// 				response.Action = scnarioConf[dnis][1].Action
// 				response.AnounceMents = scnarioConf[dnis][1].AnounceMents
// 				response.Data.Speed = scnarioConf[dnis][1].Speed
// 				response.Data.VoiceName = scnarioConf[dnis][1].VoiceName
// 				response.Data.Volume = scnarioConf[dnis][1].Volume
// 				response.Data.Pitch = scnarioConf[dnis][1].Pitch
// 				response.Data.MaxWaitTime = scnarioConf[dnis][1].MaxWaitTime
// 				response.Data.BargeIn = scnarioConf[dnis][1].BargeIn
// 				response.Data.SttMaxTime = scnarioConf[dnis][1].SttMaxTime
// 				response.Data.MaxDigit = scnarioConf[dnis][1].MaxDigit
// 				// response.Data.EndCharacter = []string{scnarioConf[dnis][1].EndCharacter}
// 				// response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count+1].DigitTerm
// 				response.Data.RecodingFile = "Y"

// 				//	s.m.Lock()
// 				s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][1].Action}
// 				//	s.m.Unlock()
// 			} else if dnis == "1000" {
// 				preEventNum := s.session[request.Token].PreEventNum
// 				fmt.Printf("\n num %+v\n", preEventNum)
// 				switch preEventNum {
// 				case 1:
// 					actionNum, err := strconv.Atoi(request.TalkText)
// 					if err == nil {
// 						response.Action = scnarioConf[dnis][actionNum+2].Action
// 						response.AnounceMents = scnarioConf[dnis][actionNum+2].AnounceMents
// 						response.Data.Speed = scnarioConf[dnis][actionNum+2].Speed
// 						response.Data.VoiceName = scnarioConf[dnis][actionNum+2].VoiceName
// 						response.Data.Volume = scnarioConf[dnis][actionNum+2].Volume
// 						response.Data.Pitch = scnarioConf[dnis][actionNum+2].Pitch
// 						response.Data.MaxWaitTime = scnarioConf[dnis][actionNum+2].MaxWaitTime
// 						response.Data.BargeIn = scnarioConf[dnis][actionNum+2].BargeIn
// 						response.Data.SttMaxTime = scnarioConf[dnis][actionNum+2].SttMaxTime
// 						response.Data.MaxDigit = scnarioConf[dnis][actionNum+2].MaxDigit
// 						response.Data.EndCharacter = []string{scnarioConf[dnis][actionNum+2].EndCharacter}
// 						response.Data.DigitTerm = scnarioConf[dnis][actionNum+2].DigitTerm
// 						response.Data.RecodingFile = "Y"

// 						//	s.m.Lock()
// 						s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][actionNum+2].Action, PreEventNum: actionNum + 2}
// 						//		s.m.Unlock()
// 					} else {
// 						response.Action = scnarioConf[dnis][1].Action
// 						response.AnounceMents = scnarioConf[dnis][1].AnounceMents
// 						response.Data.Speed = scnarioConf[dnis][1].Speed
// 						response.Data.VoiceName = scnarioConf[dnis][1].VoiceName
// 						response.Data.Volume = scnarioConf[dnis][1].Volume
// 						response.Data.Pitch = scnarioConf[dnis][1].Pitch
// 						response.Data.MaxWaitTime = scnarioConf[dnis][1].MaxWaitTime
// 						response.Data.BargeIn = scnarioConf[dnis][1].BargeIn
// 						response.Data.SttMaxTime = scnarioConf[dnis][1].SttMaxTime
// 						response.Data.MaxDigit = scnarioConf[dnis][1].MaxDigit
// 						response.Data.EndCharacter = []string{scnarioConf[dnis][1].EndCharacter}
// 						response.Data.DigitTerm = scnarioConf[dnis][1].DigitTerm
// 						response.Data.RecodingFile = "Y"

// 						//	s.m.Lock()
// 						s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][1].Action, PreEventNum: 1}
// 						//	s.m.Unlock()
// 					}
// 				case 2:
// 					actionNum, err := strconv.Atoi(request.TalkText)
// 					if err == nil {
// 						if actionNum == 1 {
// 							response.Action = scnarioConf[dnis][s.session[request.Token].PreEventNum2].Action
// 							response.AnounceMents = scnarioConf[dnis][s.session[request.Token].PreEventNum2].AnounceMents
// 							response.Data.Speed = scnarioConf[dnis][s.session[request.Token].PreEventNum2].Speed
// 							response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].PreEventNum2].VoiceName
// 							response.Data.Volume = scnarioConf[dnis][s.session[request.Token].PreEventNum2].Volume
// 							response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].PreEventNum2].Pitch
// 							response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].PreEventNum2].MaxWaitTime
// 							response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].PreEventNum2].BargeIn
// 							response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].PreEventNum2].SttMaxTime
// 							response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].PreEventNum2].MaxDigit
// 							response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].PreEventNum2].EndCharacter}
// 							response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].PreEventNum2].DigitTerm
// 							response.Data.RecodingFile = "Y"

// 							//		s.m.Lock()
// 							s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].PreEventNum2].Action, PreEventNum: s.session[request.Token].PreEventNum2}
// 							//		s.m.Unlock()
// 						} else {
// 							response.Action = scnarioConf[dnis][1].Action
// 							response.AnounceMents = scnarioConf[dnis][1].AnounceMents
// 							response.Data.Speed = scnarioConf[dnis][1].Speed
// 							response.Data.VoiceName = scnarioConf[dnis][1].VoiceName
// 							response.Data.Volume = scnarioConf[dnis][1].Volume
// 							response.Data.Pitch = scnarioConf[dnis][1].Pitch
// 							response.Data.MaxWaitTime = scnarioConf[dnis][1].MaxWaitTime
// 							response.Data.BargeIn = scnarioConf[dnis][1].BargeIn
// 							response.Data.SttMaxTime = scnarioConf[dnis][1].SttMaxTime
// 							response.Data.MaxDigit = scnarioConf[dnis][1].MaxDigit
// 							response.Data.EndCharacter = []string{scnarioConf[dnis][1].EndCharacter}
// 							response.Data.DigitTerm = scnarioConf[dnis][1].DigitTerm
// 							response.Data.RecodingFile = "Y"

// 							//		s.m.Lock()
// 							s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][1].Action, PreEventNum: 1, PreEventNum2: 1}
// 							//	s.m.Unlock()
// 						}

// 					} else {
// 						response.Action = scnarioConf[dnis][1].Action
// 						response.AnounceMents = scnarioConf[dnis][1].AnounceMents
// 						response.Data.Speed = scnarioConf[dnis][1].Speed
// 						response.Data.VoiceName = scnarioConf[dnis][1].VoiceName
// 						response.Data.Volume = scnarioConf[dnis][1].Volume
// 						response.Data.Pitch = scnarioConf[dnis][1].Pitch
// 						response.Data.MaxWaitTime = scnarioConf[dnis][1].MaxWaitTime
// 						response.Data.BargeIn = scnarioConf[dnis][1].BargeIn
// 						response.Data.SttMaxTime = scnarioConf[dnis][1].SttMaxTime
// 						response.Data.MaxDigit = scnarioConf[dnis][1].MaxDigit
// 						response.Data.EndCharacter = []string{scnarioConf[dnis][1].EndCharacter}
// 						response.Data.DigitTerm = scnarioConf[dnis][1].DigitTerm
// 						response.Data.RecodingFile = "Y"

// 						//			s.m.Lock()
// 						s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][1].Action, PreEventNum: 1}
// 						//		s.m.Unlock()
// 					}
// 				default:

// 					response.Action = scnarioConf[dnis][2].Action
// 					response.AnounceMents = "결과 " + request.TalkText + " " + scnarioConf[dnis][2].AnounceMents
// 					response.Data.Speed = scnarioConf[dnis][2].Speed
// 					response.Data.VoiceName = scnarioConf[dnis][2].VoiceName
// 					response.Data.Volume = scnarioConf[dnis][2].Volume
// 					response.Data.Pitch = scnarioConf[dnis][2].Pitch
// 					response.Data.MaxWaitTime = scnarioConf[dnis][2].MaxWaitTime
// 					response.Data.BargeIn = scnarioConf[dnis][2].BargeIn
// 					response.Data.SttMaxTime = scnarioConf[dnis][2].SttMaxTime
// 					response.Data.MaxDigit = scnarioConf[dnis][2].MaxDigit
// 					response.Data.EndCharacter = []string{scnarioConf[dnis][2].EndCharacter}
// 					response.Data.DigitTerm = scnarioConf[dnis][2].DigitTerm
// 					response.Data.RecodingFile = "Y"

// 					//	s.m.Lock()
// 					s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][2].Action, PreEventNum: 2, PreEventNum2: s.session[request.Token].PreEventNum}
// 					//s.m.Unlock()
// 				}
// 			} else {
// 				//시뮬레이터
// 				response.Action = scnarioConf[dnis][s.session[request.Token].Count].Action
// 				response.AnounceMents = scnarioConf[dnis][s.session[request.Token].Count].AnounceMents
// 				response.Data.Speed = scnarioConf[dnis][s.session[request.Token].Count].Speed
// 				response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].Count].VoiceName
// 				response.Data.Volume = scnarioConf[dnis][s.session[request.Token].Count].Volume
// 				response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].Count].Pitch
// 				response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].Count].MaxWaitTime
// 				response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].Count].BargeIn
// 				response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].Count].SttMaxTime
// 				response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].Count].MaxDigit
// 				response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].Count+1].EndCharacter}
// 				response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count].DigitTerm
// 				response.Data.RecodingFile = "Y"

// 				if s.session[request.Token].LoopCount > 100 {
// 					s.session[request.Token] = ResStatus{LoopCount: s.session[request.Token].LoopCount, Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count].Action}
// 				} else {
// 					s.session[request.Token] = ResStatus{LoopCount: s.session[request.Token].LoopCount + 1, Count: s.session[request.Token].Count, Status: scnarioConf[dnis][s.session[request.Token].Count].Action}
// 				}
// 				//			s.m.Lock()
// 				//		s.m.Unlock()
// 			}
// 		case "REFER":
// 			response.ResultCode = 200
// 			response.Token = request.Token
// 			response.Action = "TRANSFER"
// 			response.AnounceMents = "네. 매장으로 연결해드릴게요."
// 			response.Data.BargeIn = ""
// 			response.Data.RecodingFile = ""
// 			response.Data.SttMaxTime = 0
// 			response.Data.TelNo = request.TelNo

// 			//	s.m.Lock()
// 			s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count+1].Action}
// 		case "TRANSFER":
// 			response.ResultCode = 200
// 			response.Token = request.Token
// 			response.Action = "TRANSFER"
// 			response.AnounceMents = "네. 매장으로 연결해드릴게요."
// 			response.Data.BargeIn = ""
// 			response.Data.RecodingFile = ""
// 			response.Data.SttMaxTime = 0
// 			response.Data.TelNo = request.TelNo
// 			s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count+1].Action}
// 		}

// 	}

// 	response.Data.UUI = json.RawMessage{}
// 	uuiMap := map[string]interface{}{
// 		"test1": "testdata1231",
// 		"test2": 123,
// 		"test3": 0.1,
// 	}

// 	// 맵을 JSON으로 마샬링
// 	uuiJSON, err := json.Marshal(uuiMap)
// 	if err != nil {
// 		fmt.Println("Error marshaling UUI:", err)
// 		return
// 	}

// 	// 마샬링된 JSON을 json.RawMessage로 변환
// 	response.Data.UUI = json.RawMessage(uuiJSON)
// 	response.Data.TelNo = request.TelNo
// 	s.m.Unlock()
// 	// response marshal

// 	resMarshal, jerr := json.Marshal(response)
// 	if jerr != nil {
// 		fmt.Println("Json Marshal error ", jerr)
// 	}
// 	fmt.Printf("%+v", response)
// 	l.Printf(icslog.LOG_LEVEL_INFO, -1, "Send Message\n %s", string(resMarshal))

// 	time.Sleep(time.Second * 1)
// 	// send response
// 	fmt.Fprintln(w, string(resMarshal))

// }

func createToken(callId string) string {
	token := ""
	times := fmt.Sprintf("%d", time.Now().UnixNano()/1000000)
	tokens := strings.Split(callId, "@")[0] + times
	token = tokens[0:8] + "-" + tokens[8:10] + "-" + tokens[10:23]
	return token
}

func cryptoRandSecure(max int64) int64 {
	nBig, err := rand.Int(rand.Reader, big.NewInt(max))
	if err != nil {
		fmt.Println(err)
	}
	return nBig.Int64()
}

func (s *ScenarioSession) ByeCheck(method string, token string) {
	l := icslog.GetIcsLog()
	// fmt.Printf(">>>>>> SESSION BYE INFO - token [%s]\n", token)
	l.Printf(icslog.LOG_LEVEL_INFO, -1, ">>>>>> SESSION BYE INFO - token [%s] ", token)
	s.m.Lock()
	delete(s.session, token)
	s.m.Unlock()
}
