package formview

import (
	"fmt"
	"go_dreamfactory/cmd/v2/lib/common"
	"go_dreamfactory/cmd/v2/model"
	"go_dreamfactory/cmd/v2/service"
	"go_dreamfactory/cmd/v2/service/observer"
	"go_dreamfactory/comm"
	"go_dreamfactory/pb"
	"strings"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"
	"github.com/sirupsen/logrus"
	"github.com/spf13/cast"
)

type ReddotView struct {
	reddotList func()
	BaseformView
	itemList *common.ItemList
	flag     bool
}

func (this *ReddotView) CreateView(t *model.TestCase) fyne.CanvasObject {
	this.itemList = common.NewItemList()

	this.itemList.ItemList = this.itemList.CreateList()

	reddotTypeEntry := widget.NewEntry()

	this.form.AppendItem(widget.NewFormItem("红点类型", reddotTypeEntry))
	this.form.OnSubmit = func() {
		typesStr := strings.Split(reddotTypeEntry.Text, ",")
		var rids []int32
		for _, s := range typesStr {
			rids = append(rids, cast.ToInt32(s))
		}
		if err := service.GetPttService().SendToClient(t.MainType, "get",
			&pb.ReddotGetReq{
				Rids: rids,
			}); err != nil {
			logrus.Error(err)
		}
	}

	this.reddotList = func() {
		if err := service.GetPttService().SendToClient(
			string("reddot"),
			"getall",
			&pb.ReddotGetAllReq{}); err != nil {
			logrus.Error(err)
		}
	}

	defer this.reddotList()

	refreshBtn := widget.NewButtonWithIcon("", theme.ViewRefreshIcon(), func() {
		this.itemList.Reset()
		this.reddotList()
	})

	this.dataListener()
	buttonBar := container.NewHBox(refreshBtn)
	c := container.NewBorder(buttonBar, this.form, nil, nil, this.itemList.ItemList)
	return c
}

func (this *ReddotView) dataListener() {
	this.obs.AddListener(observer.EVENT_REQ_RSP, observer.Listener{
		OnNotify: func(d interface{}, args ...interface{}) {
			data := d.(*pb.UserMessage)
			if !(data.MainType == string("reddot") &&
				data.SubType == "getall") {
				return
			}
			rsp := &pb.ReddotGetAllResp{}

			if !comm.ProtoUnmarshal(data, rsp) {
				logrus.Error("unmarshal err")
			}

			for k, v := range rsp.Reddot {
				item := common.Item{
					Id:   cast.ToString(k),
					Text: fmt.Sprintf("%v - %v", k, v),
				}
				this.itemList.AddItem(item)
			}

		},
	})
}
