package web import ( "html/template" "net/http" "pool-stats/constants" "pool-stats/database" "pool-stats/models" "time" ) type DailyStatsPageData struct { DailyStats []models.DailyStats Start string End string NextPageAvailable bool NextPageStart string NextPageEnd string PrevPageAvailable bool PrevPageStart string PrevPageEnd string } func (ws *WebServer) DailyStatsHandler(w http.ResponseWriter, r *http.Request) { tmpl, err := template.Must(ws.templates.Clone()).ParseFiles("templates/daily_stats.html") if err != nil { http.Error(w, "Failed to parse template", http.StatusInternalServerError) println("Error parsing template:", err.Error()) return } startParam := r.URL.Query().Get("start") endParam := r.URL.Query().Get("end") var startTime, endTime time.Time if startParam == "" || endParam == "" { endTime = time.Now().Truncate(24 * time.Hour) startTime = endTime.AddDate(0, 0, -constants.DailyStatsPerPage+1) } else { startTime, err = time.Parse(time.DateOnly, startParam) if err != nil { http.Error(w, "Invalid start time format", http.StatusBadRequest) return } endTime, err = time.Parse(time.DateOnly, endParam) if err != nil { http.Error(w, "Invalid end time format", http.StatusBadRequest) return } } daysCount := int(endTime.Sub(startTime).Hours() / 24) if daysCount < 0 { http.Error(w, "End time must be after start time", http.StatusBadRequest) return } if daysCount > constants.DailyStatsPerPage { http.Error(w, "Too many days requested", http.StatusBadRequest) return } dailyStats := make([]models.DailyStats, 0) for t := endTime; !t.Before(startTime); t = t.AddDate(0, 0, -1) { stats, err := database.GetDailyStats(ws.db, t) if err != nil { http.Error(w, "Failed to fetch daily stats", http.StatusInternalServerError) return } dailyStats = append(dailyStats, *stats) } nextPageStart := endTime.AddDate(0, 0, 1) nextPageEnd := endTime.AddDate(0, 0, constants.DailyStatsPerPage) prevPageEnd := startTime.AddDate(0, 0, -1) prevPageStart := startTime.AddDate(0, 0, -constants.DailyStatsPerPage) data := DailyStatsPageData{ DailyStats: dailyStats, Start: startTime.Format(time.DateOnly), End: endTime.Format(time.DateOnly), NextPageAvailable: nextPageStart.Before(time.Now()), NextPageStart: nextPageStart.Format(time.DateOnly), NextPageEnd: nextPageEnd.Format(time.DateOnly), PrevPageAvailable: prevPageStart.After(constants.EpochTime), PrevPageStart: prevPageStart.Format(time.DateOnly), PrevPageEnd: prevPageEnd.Format(time.DateOnly), } if err := tmpl.ExecuteTemplate(w, "daily_stats.html", data); err != nil { http.Error(w, "Failed to render template", http.StatusInternalServerError) println("Error rendering template:", err.Error()) return } }