package srv

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"time"

	"git.clearsky.net.au/cody/gex.git/utils"
)

type Res struct {
	w       http.ResponseWriter
	r       *http.Request
	status  int
	cookies map[string]*http.Cookie
}

func (res *Res) Construct(w http.ResponseWriter, r *http.Request) {
	res.w = w
	res.r = r
	res.status = 200
	res.cookies = make(map[string]*http.Cookie)
}

func (res *Res) Send(txt string) {
	for _, v := range res.cookies {
		http.SetCookie(res.w, v)
	}

	res.w.WriteHeader(res.status)

	fmt.Fprint(res.w, txt)
}

func (res *Res) File(filePath string) error {
	file, err := os.Open(filePath)
	if err != nil {
		utils.Err(err)
		return err
	}
	defer file.Close()

	_, err = io.Copy(res.w, file)
	if err != nil {
		utils.Err(err)
		return err
	}
	return nil
}

func (res *Res) Redirect(url string) {
	for _, v := range res.cookies {
		http.SetCookie(res.w, v)
	}
	http.Redirect(res.w, res.r, url, http.StatusTemporaryRedirect)
}

func (res *Res) Status(code int) *Res {
	res.status = code
	return res
}

func (res *Res) Header(k string, v string) *Res {
	res.w.Header().Add(k, v)
	return res
}

func (res *Res) JSON(json string) {
	res.Header("Content-type", "application/json").Send(json)
}

func (res *Res) Cookie(name string, val string, expires ...time.Time) *Res {
	Expires := time.Now().Add(365 * 24 * time.Hour)
	for _, v := range expires {
		Expires = v
	}
	cookie := &http.Cookie{
		Name:     name,
		Value:    val,
		Expires:  Expires,
		Path:     "/",
		Secure:   true,
		HttpOnly: true,
		SameSite: http.SameSiteStrictMode,
	}

	res.cookies[name] = cookie
	return res
}