package main import ( "fmt" "sort" "strings" ) func buildTasksForDay(plans []Plan, month, day int) []Task { var tasks []Task for _, p := range plans { field := p.TargetName if strings.TrimSpace(field) == "" { field = "Unbekanntes Feld" } if p.StartMonth == month && p.StartDay == day { tasks = append(tasks, Task{Type: "Aussaat", Field: field, Message: fmt.Sprintf("%s auf %s aussaeen", p.CropName, field), SortOrder: 1}) } if p.HarvestMonth == month && p.HarvestDay == day { tasks = append(tasks, Task{Type: "Ernte", Field: field, Message: fmt.Sprintf("%s auf %s ernten", p.CropName, field), SortOrder: 2}) } } sort.Slice(tasks, func(i, j int) bool { if tasks[i].SortOrder == tasks[j].SortOrder { return tasks[i].Field < tasks[j].Field } return tasks[i].SortOrder < tasks[j].SortOrder }) return tasks } func buildCalendar(plans []Plan, startMonth, startDay, daysPerMonth, spanMonths int) []CalendarMonth { tasksByKey := make(map[string][]Task) for _, p := range plans { field := p.TargetName if strings.TrimSpace(field) == "" { field = "Unbekanntes Feld" } tasksByKey[fmt.Sprintf("%d-%d", p.StartMonth, p.StartDay)] = append(tasksByKey[fmt.Sprintf("%d-%d", p.StartMonth, p.StartDay)], Task{ Type: "Aussaat", Field: field, Message: fmt.Sprintf("%s auf %s", p.CropName, field), SortOrder: 1, }) tasksByKey[fmt.Sprintf("%d-%d", p.HarvestMonth, p.HarvestDay)] = append(tasksByKey[fmt.Sprintf("%d-%d", p.HarvestMonth, p.HarvestDay)], Task{ Type: "Ernte", Field: field, Message: fmt.Sprintf("%s auf %s", p.CropName, field), SortOrder: 2, }) } var out []CalendarMonth for offset := 0; offset < spanMonths; offset++ { month := wrapMonth(startMonth + offset) yearOffset := (startMonth - 1 + offset) / 12 label := monthNames[month-1] if yearOffset > 0 { label = fmt.Sprintf("%s (+%d Jahr)", label, yearOffset) } fromDay := 1 if offset == 0 { fromDay = startDay } var days []CalendarDay for day := fromDay; day <= daysPerMonth; day++ { key := fmt.Sprintf("%d-%d", month, day) items := append([]Task(nil), tasksByKey[key]...) sort.Slice(items, func(i, j int) bool { if items[i].SortOrder == items[j].SortOrder { return items[i].Field < items[j].Field } return items[i].SortOrder < items[j].SortOrder }) days = append(days, CalendarDay{Day: day, Tasks: items}) } out = append(out, CalendarMonth{ Offset: offset, Month: month, Label: label, YearOffset: yearOffset, Days: days, }) } return out }