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