package ginext

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gogs.mikescher.com/BlackForestBytes/goext/langext"
	"os"
)

type fileHTTPResponse struct {
	mimetype string
	filepath string
	filename *string
	headers  []headerval
	cookies  []cookieval
}

func (j fileHTTPResponse) Write(g *gin.Context) {
	g.Header("Content-Type", j.mimetype) // if we don't set it here gin does weird file-sniffing later...
	if j.filename != nil {
		g.Header("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", *j.filename))

	}
	for _, v := range j.headers {
		g.Header(v.Key, v.Val)
	}
	for _, v := range j.cookies {
		g.SetCookie(v.name, v.value, v.maxAge, v.path, v.domain, v.secure, v.httpOnly)
	}
	g.File(j.filepath)
}

func (j fileHTTPResponse) WithHeader(k string, v string) HTTPResponse {
	j.headers = append(j.headers, headerval{k, v})
	return j
}

func (j fileHTTPResponse) WithCookie(name string, value string, maxAge int, path string, domain string, secure bool, httpOnly bool) HTTPResponse {
	j.cookies = append(j.cookies, cookieval{name, value, maxAge, path, domain, secure, httpOnly})
	return j
}

func (j fileHTTPResponse) IsSuccess() bool {
	return true
}

func (j fileHTTPResponse) Statuscode() int {
	return 200
}

func (j fileHTTPResponse) BodyString(*gin.Context) *string {
	data, err := os.ReadFile(j.filepath)
	if err != nil {
		return nil
	}
	return langext.Ptr(string(data))
}

func (j fileHTTPResponse) ContentType() string {
	return j.mimetype
}

func (j fileHTTPResponse) Headers() []string {
	return langext.ArrMap(j.headers, func(v headerval) string { return v.Key + "=" + v.Val })
}

func File(mimetype string, filepath string) HTTPResponse {
	return &fileHTTPResponse{mimetype: mimetype, filepath: filepath}
}

func Download(mimetype string, filepath string, filename string) HTTPResponse {
	return &fileHTTPResponse{mimetype: mimetype, filepath: filepath, filename: &filename}
}