package model

import (
	"fmt"
	"sort"

	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
	"go.uber.org/zap"

	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
)

type IndicatorsData struct {
	Id           int64                        `json:"id"`
	PastureId    int64                        `json:"pastureId"`
	CategoryType pasturePb.IndicatorType_Kind `json:"categoryType"`
	CategoryName string                       `json:"categoryName"`
	Date         string                       `json:"date"`
	Kind         string                       `json:"kind"`
	Value        string                       `json:"value"`
	CreatedAt    int64                        `json:"createdAt"`
	UpdatedAt    int64                        `json:"updatedAt"`
}

func (d *IndicatorsData) TableName() string {
	return "indicators_data"
}

type IndicatorsDataSlice []*IndicatorsData

func (i IndicatorsDataSlice) ToPB(detailsMap map[string]*IndicatorsDetails) *IndicatorComparison {
	res := &IndicatorComparison{
		Headers: make([]string, 0),
		List:    make([]map[string]string, 0),
	}
	dateSet := make(map[string]struct{}) // 使用空结构体节省内存
	for _, v := range i {
		dateSet[v.Date] = struct{}{}
	}
	for date := range dateSet {
		res.Headers = append(res.Headers, date)
	}
	sort.Strings(res.Headers) // 确保日期顺序一致
	dataMap := make(map[string]map[string]string)
	for _, v := range i {
		details, ok := detailsMap[v.Kind]
		if !ok {
			zaplog.Error("detailsMap", zap.Any("Kind", v.Kind))
			continue
		}
		if data, exists := dataMap[details.Kind]; exists {
			data[v.Date] = v.Value
		} else {
			data = make(map[string]string)
			for _, date := range res.Headers {
				data[date] = "" // 初始化所有日期为空字符串
			}
			data[v.Date] = v.Value
			data["name"] = details.Name
			data["kind"] = details.Kind
			data["unit"] = details.Unit
			data["categoryType"] = fmt.Sprintf("%d", details.CategoryType)
			data["categoryName"] = details.CategoryName
			data["zh"] = details.Zh
			dataMap[details.Kind] = data
		}
	}

	for _, data := range dataMap {
		res.List = append(res.List, data)
	}
	return res
}

type IndicatorsComparisonResponse struct {
	Code int32                `json:"code"`
	Msg  string               `json:"msg"`
	Data *IndicatorComparison `json:"data"`
}

type IndicatorComparison struct {
	Headers []string            `json:"headers"`
	List    []map[string]string `json:"list"`
}