package handlers import ( "database/sql" "log" "net/http" "synlotto-website/helpers" "synlotto-website/storage" ) func MessagesInboxHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) tmpl := helpers.LoadTemplateFiles("messages.html", "templates/account/messages/index.html") err := tmpl.ExecuteTemplate(w, "layout", context) if err != nil { helpers.RenderError(w, r, 500) } } } func ReadMessageHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { idStr := r.URL.Query().Get("id") messageID := helpers.Atoi(idStr) session, _ := helpers.GetSession(w, r) userID, ok := session.Values["user_id"].(int) if !ok { helpers.RenderError(w, r, 403) return } message, err := storage.GetMessageByID(db, userID, messageID) if err != nil { log.Printf("❌ Message not found: %v", err) message = nil } else if !message.IsRead { _ = storage.MarkMessageAsRead(db, messageID, userID) } data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) context["Message"] = message tmpl := helpers.LoadTemplateFiles("read-message.html", "templates/account/messages/read.html") tmpl.ExecuteTemplate(w, "layout", context) } } func ArchiveMessageHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { id := helpers.Atoi(r.URL.Query().Get("id")) userID, ok := helpers.GetCurrentUserID(r) if !ok { helpers.RenderError(w, r, 403) return } err := storage.ArchiveMessage(db, userID, id) if err != nil { helpers.SetFlash(w, r, "Failed to archive message.") } else { helpers.SetFlash(w, r, "Message archived.") } http.Redirect(w, r, "/account/messages", http.StatusSeeOther) } } func ArchivedMessagesHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { userID, ok := helpers.GetCurrentUserID(r) if !ok { helpers.RenderError(w, r, 403) return } page := helpers.Atoi(r.URL.Query().Get("page")) if page < 1 { page = 1 } perPage := 10 messages := storage.GetArchivedMessages(db, userID, page, perPage) hasMore := len(messages) == perPage data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) context["Messages"] = messages context["Page"] = page context["HasMore"] = hasMore tmpl := helpers.LoadTemplateFiles("archived.html", "templates/account/messages/archived.html") tmpl.ExecuteTemplate(w, "layout", context) } } func SendMessageHandler(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: // Display the form data := BuildTemplateData(db, w, r) context := helpers.TemplateContext(w, r, data) tmpl := helpers.LoadTemplateFiles("send-message.html", "templates/account/messages/send.html") if err := tmpl.ExecuteTemplate(w, "layout", context); err != nil { helpers.RenderError(w, r, 500) } case http.MethodPost: // Handle form submission senderID, ok := helpers.GetCurrentUserID(r) if !ok { helpers.RenderError(w, r, 403) return } recipientID := helpers.Atoi(r.FormValue("recipient_id")) subject := r.FormValue("subject") body := r.FormValue("message") if err := storage.SendMessage(db, senderID, recipientID, subject, body); err != nil { helpers.SetFlash(w, r, "Failed to send message.") } else { helpers.SetFlash(w, r, "Message sent.") } http.Redirect(w, r, "/account/messages", http.StatusSeeOther) default: helpers.RenderError(w, r, 405) } } }