package handlers

import (
	"ladder/proxychain"
	rx "ladder/proxychain/requestmodifiers"
	tx "ladder/proxychain/responsemodifiers"

	"github.com/gofiber/fiber/v2"
)

func NewRawProxySiteHandler(opts *ProxyOptions) fiber.Handler {

	return func(c *fiber.Ctx) error {
		proxychain := proxychain.
			NewProxyChain().
			SetFiberCtx(c).
			SetRequestModifications(
				rx.AddCacheBusterQuery(),
				rx.MasqueradeAsGoogleBot(),
				rx.ForwardRequestHeaders(),
				rx.HideOrigin(),
				rx.DeleteOutgoingCookies(),
				rx.SpoofReferrerFromRedditPost(),
			)

		// no options passed in, return early
		if opts == nil {
			// return as plaintext, overriding any rules
			proxychain.AddOnceResponseModifications(
				tx.SetResponseHeader("content-type", "text/plain; charset=UTF-8"),
			)

			return proxychain.Execute()
		}

		// load ruleset
		rule, exists := opts.Ruleset.GetRule(proxychain.Request.URL)
		if exists {
			proxychain.AddOnceRequestModifications(rule.RequestModifications...)
			proxychain.AddOnceResponseModifications(rule.ResponseModifications...)
		}

		// return as plaintext, overriding any rules
		proxychain.AddOnceResponseModifications(
			tx.SetResponseHeader("content-type", "text/plain; charset=UTF-8"),
		)

		return proxychain.Execute()
	}
}
