package tgbot

import (
	"fmt"
	"log"
	"net/http"
	"net/url"
	"tg-mc/conf"
	"tg-mc/models"
	"tg-mc/services/utils"

	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
	"github.com/sirupsen/logrus"
)

func Run(sendFunc func(string)) {
	var err error

	HttpProxy := conf.GetBotSettings().HTTPProxy
	proxyUrl, err := url.Parse(HttpProxy)
	if err != nil {
		log.Panic(err, "HTTP_PROXY environment variable is not set correctly")
	}

	client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
	conf.Bot, err = tgbotapi.NewBotAPIWithClient(
		conf.GetBotSettings().BotToken,
		tgbotapi.APIEndpoint,
		client)

	if err != nil {
		log.Panic(err)
	}

	conf.Bot.Debug = false

	log.Printf("Authorized on account %s", conf.Bot.Self.UserName)

	u := tgbotapi.NewUpdate(0)
	u.Timeout = 60
	updates := conf.Bot.GetUpdatesChan(u)

	for update := range updates {
		if update.Message != nil {
			go func(m *tgbotapi.Message) {
				logrus.Infof("[%s] %s", m.From.UserName, m.Text)
				if m.Command() == "talk" {
					logrus.Infof("id is %d", m.Chat.ID)
					m := fmt.Sprintf("%v: %v", m.From.UserName, m.CommandArguments())
					sendFunc(m)
					logrus.WithError(err).Error("send message error")
					return
				}
				if m.Command() == "list" {
					logrus.Infof("id is %d", m.Chat.ID)
					m := tgbotapi.NewMessage(m.Chat.ID, utils.GetAlivePlayer())
					conf.Bot.Send(m)
					return
				}
				if m.Command() == "bind" {
					logrus.Infof("id is %d", m.Chat.ID)
					models.CreateUserIfNotExist(m.From.ID, &models.User{
						TGID:   m.From.ID,
						MCName: m.CommandArguments(),
						Status: 1,
					})
					m := tgbotapi.NewMessage(m.Chat.ID,
						fmt.Sprintf("绑定成功，你的MCID是%v", m.CommandArguments()))
					conf.Bot.Send(m)
					return
				}
				if m.Command() == "unbind" {
					logrus.Infof("id is %d", m.Chat.ID)
					u, err := models.GetUserByTGID(m.From.ID)
					if err != nil {
						m := tgbotapi.NewMessage(m.Chat.ID, "你还没有绑定")
						conf.Bot.Send(m)
						return
					}
					err = u.Delete(m.From.ID)
					if err != nil {
						m := tgbotapi.NewMessage(m.Chat.ID, "解绑失败")
						conf.Bot.Send(m)
						return
					}
					m := tgbotapi.NewMessage(m.Chat.ID, "解绑成功")
					conf.Bot.Send(m)
					return
				}
			}(update.Message)
		}
	}
}
