package model

import (
	"fmt"
	"sort"

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

const (
	AllCow            = "all_cow"
	CalvingInterval   = "calving_interval"
	OutputNumber      = "output_number"
	InputNumber       = "input_number"
	SalesVolume       = "sales_volume"
	CalvingNumber     = "calving_number"
	AdultAbortionRate = "adult_abortion_rate"
	YouthAbortionRate = "youth_abortion_rate"
	AllDieNumber      = "all_die_number"
	DiseaseNumber     = "disease_number"
	CureNumber        = "cure_number"
	OutNumber         = "out_number"
	CalfDieNumber     = "calf_die_number"
)

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(header, kinds []string, detailsMap map[string]*IndicatorsDetails) *IndicatorComparison {
	res := &IndicatorComparison{
		Headers: header,
		List:    make([]map[string]string, 0),
	}

	if len(header) <= 0 || len(detailsMap) <= 0 || len(kinds) <= 0 || len(i) <= 0 {
		return res
	}

	sort.Strings(res.Headers) // 确保日期顺序一致
	indicatorsDataMap := make(map[string]*IndicatorsData)
	for _, v := range i {
		indicatorsDataMap[fmt.Sprintf("%s-%s", v.Kind, v.Date)] = v
	}

	dataMap := make(map[string]map[string]string)
	for _, kind := range kinds {
		if dataMap[kind] == nil {
			dataMap[kind] = make(map[string]string)
		}
		details := detailsMap[kind]
		dataMap[kind] = map[string]string{
			"name":         details.Name,
			"kind":         details.Kind,
			"unit":         details.Unit,
			"categoryType": fmt.Sprintf("%d", details.CategoryType),
			"categoryName": details.CategoryName,
			"zh":           details.Zh,
		}

		for _, v := range header {
			pref := fmt.Sprintf("%s-%s", kind, v)
			indicators, ok := indicatorsDataMap[pref]
			if ok {
				dataMap[kind][v] = indicators.Value
			} else {
				dataMap[kind][v] = ""
			}
		}
	}

	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"`
}