package chat

import (
"encoding/base64"
"fmt"
"gugegin/tools"

"io"
"io/ioutil"
"log"
"net/http"
"os"
"strings"

"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
ReadBufferSize: 4096,
WriteBufferSize: 4096,
EnableCompression: true,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
var mp = make(map[int]*websocket.Conn)

//文字聊天
func Wenzi(c *gin.Context) {
fmt.Println("---------文字聊天---------")
uid := 100
chatid := 200
fmt.Println("--------uid---------")
fmt.Println(uid)
fmt.Println(chatid)

//服务升级,对于来到的http连接进行服务升级,升级到ws
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
log.Println(err)
}
mp[chatid] = conn
defer func() {
err := conn.Close()
if err != nil {
log.Println(err)
}
}()

log.Println("Client Connected")

err = conn.WriteMessage(1, []byte("已连接服务器"))
if err != nil {
log.Println(err)
}

for {
//messageType int, p []byte, err error
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
xiaoxi := string(message)
fmt.Println("----发送内容----------", xiaoxi)
if strings.Contains(xiaoxi, ",") {
index1 := strings.Index(xiaoxi, ",")
fmt.Println(xiaoxi[0:index1]) //对方的chatid
x2 := xiaoxi[index1+1:]
index2 := strings.Index(x2, ",")
fmt.Println(x2[0:index2]) //消息类型:1文字,2图片,3语音
fmt.Println(x2[index2+1:]) //发给对方的message
message = []byte(x2[index2+1:])
}

for k, v := range mp {
fmt.Println("------当前连接的chatid-------", k)
err = v.WriteMessage(messageType, message)
if err != nil {
fmt.Println("-----删除当前已关闭的chatid-------", k)
log.Println("write:", err)
delete(mp, k)
break
}
}

// err = conn.WriteMessage(messageType, message)
// if err != nil {
// log.Println("write:", err)
// break
// }
}
}

//语音聊天
func Yuyin(c *gin.Context) {
fmt.Println("---------语音聊天---------")
uid := 100
chatid := 200
fmt.Println("--------uid---------")
fmt.Println(uid)
fmt.Println(chatid)

//服务升级,对于来到的http连接进行服务升级,升级到ws
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
log.Println(err)
}
mp[chatid] = conn
defer func() {
err := conn.Close()
if err != nil {
log.Println(err)
}
}()

log.Println("Client Connected")

err = conn.WriteMessage(1, []byte("准备接收语音"))
if err != nil {
log.Println(err)
}

for {
//messageType int, p []byte, err error
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}

fmt.Println("----messageType----------", messageType)
// fmt.Println("----接收到的信息----------", string(message))
if len(string(message)) > 200 {
voice := string(message)
fmt.Println("----接收语音----------")
i := strings.Index(voice, ",")

decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(voice[i+1:]))
fileName := tools.RandomStr(20)
// 以流式解码
buf := make([]byte, 2)
// 保存解码后的数据
dst := ``
for {
n, err := decoder.Read(buf)
if n == 0 || err != nil {
break
}
dst += string(buf[:n])
}

// randomStr(20)
err := ioutil.WriteFile(`C:\\Users\\Administrator\\Desktop\\77\\`+fileName+`.mp3`, []byte(dst), 0666)
if err != nil {
log.Println(err)
}

fmt.Println("----语音接收完成----------")
// 发送给每个用户
for k, v := range mp {
fmt.Println("---------k-------", k)
err = v.WriteMessage(1, []byte(fileName+".mp3"))
if err != nil {
log.Println("write:", err)
break
}
}
// 发送当前用户
// err = conn.WriteMessage(1, []byte(fileName+".mp3"))
// if err != nil {
// log.Println("write:", err)
// break
// }
}

}
}

//图片聊天
func Tupian(c *gin.Context) {
fmt.Println("---------图片聊天---------")
uid := 100
chatid := 200
fmt.Println("--------uid---------")
fmt.Println(uid)
fmt.Println(chatid)

//服务升级,对于来到的http连接进行服务升级,升级到ws
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
log.Println(err)
}
mp[chatid] = conn
defer func() {
err := conn.Close()
if err != nil {
log.Println(err)
}
}()

log.Println("Client Connected")

err = conn.WriteMessage(1, []byte("准备接收图片"))
if err != nil {
log.Println(err)
}

for {
//messageType int, p []byte, err error
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}

fmt.Println("----messageType----------", messageType)
// fmt.Println("----接收到的信息----------", string(message))
if len(string(message)) > 200 {
photo := string(message)
fmt.Println("----接收图片----------")
i := strings.Index(photo, ",")
dec := base64.NewDecoder(base64.StdEncoding, strings.NewReader(photo[i+1:]))
picName := tools.RandomStr(20)
f, err := os.Create(tools.Dir() + picName + ".jpg")
if err != nil {
log.Println(err)
}
f.Close()
_, err = io.Copy(f, dec)
if err != nil {
log.Println(err)
}
fmt.Println("----图片接收完成----------")
// 发送给每个用户
for k, v := range mp {
fmt.Println("---------k-------", k)
err = v.WriteMessage(1, []byte(picName+".jpg"))
if err != nil {
log.Println("write:", err)
break
}
}
// 发送当前用户
// err = conn.WriteMessage(1, []byte(picName+".jpg"))
// if err != nil {
// log.Println("write:", err)
// break
// }
}

}

}