package web

import (
	"fmt"
	"log"
	"net/http"
	"time"

	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"

	"code.osinet.fr/fgm/sqs_demo/back/services/redriver"
)

func makeDeleteHandler(rd redriver.Redriver) gin.HandlerFunc {
	return func(c *gin.Context) {
		ctx := c.Request.Context()
		qName := c.Param("name")
		redirect := "/queue/" + qName

		sess := sessions.Default(c)
		// Do not consume sess.Flashes(): this is a redirect-only handler, and they would be lost.
		defer func() {
			_ = sess.Save()
			c.Redirect(http.StatusSeeOther, redirect)
		}()

		req := c.Request
		if err := req.ParseForm(); err != nil {
			log.Printf("Failed to parse deletion confirm form for queue %s: %v",
				qName, err)
			sess.AddFlash(fmt.Sprintf("Failed to parsed deletion confirmm form for queue %s",
				qName))
			return
		}
		ids := parseIDs(req.Form, validateUint)

		var messages []redriver.Message
		if len(ids) == 0 {
			flash := fmt.Sprintf("Got no message to delete from queue %q", qName)
			log.Print(flash)
			sess.AddFlash(flash)
			return
		}
		messages = parseMessages(req.Form, ids)

		keys := make([]redriver.ItemsKeys, len(messages))
		for i, msg := range messages {
			keys[i] = redriver.ItemsKeys{
				MessageID:     msg.MessageId,
				ReceiptHandle: msg.ReceiptHandle,
			}
		}
		t0 := time.Now()
		err := rd.DeleteItems(ctx, qName, keys)
		latency := time.Since(t0)
		if err != nil {
			log.Printf("failed deleting %d items from queue %q: %v",
				len(keys), qName, err)
			sess.AddFlash(fmt.Sprintf("Failed deleting %d items from queue %q",
				len(keys), qName))
			return
		}

		sess.AddFlash(fmt.Sprintf("Deleted %d items from queue %s in %v", len(keys),
			qName, latency))
	}
}