package gw

import (
	"errors"
	"mime/multipart"
	"net/http"
	"strings"

	"log/slog"

	"github.com/gin-gonic/gin"
	db "github.com/itsscb/df/bff/db/sqlc"
)

type uploadDocumentRequest struct {
	PersonID uint64                `form:"person_id"`
	MailID   uint64                `form:"mail_id"`
	File     *multipart.FileHeader `form:"file"`
}

func (server *Server) UploadDocument(ctx *gin.Context) {
	authHeader := ctx.GetHeader("authorization")

	authFields := strings.Fields(authHeader)

	if len(authFields) != 2 {
		ctx.JSON(http.StatusUnauthorized, errorResponse(errors.New("invalid or missing authorization header")))
		return
	}

	token := authFields[1]

	authPayload, err := server.tokenMaker.VerifyToken(token)
	if err != nil {
		ctx.JSON(http.StatusUnauthorized, errorResponse(errors.New("invalid authorization header")))
		return
	}

	account, err := server.store.GetAccount(ctx, authPayload.AccountID)
	if err != nil {
		ctx.JSON(http.StatusNotFound, errorResponse(errors.New("account not found")))
		return
	}

	var req *uploadDocumentRequest
	err = ctx.ShouldBind(&req)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, errorResponse(errors.New("failed to parse request")))
		return
	}

	r := db.CreateDocumentTxParams{
		AccountID: account.ID,
		PersonID:  req.PersonID,
		MailID:    req.MailID,
		File:      req.File,
		Creator:   account.Email,
	}

	doc, code, err := server.store.CreateDocumentTx(ctx, r)
	if err != nil {
		if code == http.StatusInternalServerError {
			slog.Error("create_document", slog.Int64("invoked_by", int64(authPayload.AccountID)), slog.String("document_name", req.File.Filename), slog.String("error", err.Error()))
		}
		ctx.JSON(code, errorResponse(err))
		return
	}

	ctx.JSON(http.StatusOK, doc)
}