package router

import (
	"crypto/tls"
	"net"
	"net/http"
	"net/http/httputil"
	"opencatd-open/llm/claude"
	oai "opencatd-open/llm/openai"
	"time"

	"github.com/gin-gonic/gin"
)

func HandleProxy(c *gin.Context) {
	if c.Request.URL.Path == "/v1/complete" {
		claude.ClaudeProxy(c)
		return
	}
	if c.Request.URL.Path == "/v1/audio/transcriptions" {
		oai.WhisperProxy(c)
		return
	}
	if c.Request.URL.Path == "/v1/audio/speech" {
		oai.SpeechProxy(c)
		return
	}

	if c.Request.URL.Path == "/v1/images/generations" {
		oai.DallEProxy(c)
		return
	}

	if c.Request.URL.Path == "/v1/realtime" {
		oai.RealTimeProxy(c)
		return
	}

	if c.Request.URL.Path == "/v1/chat/completions" {
		ChatHandler(c)
		return
	}

}

func HandleReverseProxy(c *gin.Context, targetHost string) {
	proxy := &httputil.ReverseProxy{
		Director: func(req *http.Request) {
			req.URL.Scheme = "https"
			req.URL.Host = targetHost
		},
		Transport: &http.Transport{
			Proxy: http.ProxyFromEnvironment,
			DialContext: (&net.Dialer{
				Timeout:   30 * time.Second,
				KeepAlive: 30 * time.Second,
			}).DialContext,
			ForceAttemptHTTP2:     true,
			MaxIdleConns:          100,
			IdleConnTimeout:       90 * time.Second,
			TLSHandshakeTimeout:   10 * time.Second,
			ExpectContinueTimeout: 1 * time.Second,
			TLSClientConfig:       &tls.Config{InsecureSkipVerify: true},
		},
	}

	req, err := http.NewRequest(c.Request.Method, c.Request.URL.Path, c.Request.Body)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}
	req.Header = c.Request.Header

	proxy.ServeHTTP(c.Writer, req)
	return
}
