package handler

import (
	"crypto/tls"
	"fmt"
	"github.com/bjdgyc/anylink/proxyproto"
	"log"
	"net"
	"net/http"
	"net/http/httputil"
	_ "net/http/pprof"
	"time"

	"github.com/bjdgyc/anylink/common"
	"github.com/julienschmidt/httprouter"
)

func Start() {
	testTun()
	go startDebug()
	go startDtls()
	go startTls()
}

func startDebug() {
	http.ListenAndServe(common.ServerCfg.DebugAddr, nil)
}

func startTls() {
	addr := common.ServerCfg.ServerAddr
	certFile := common.ServerCfg.CertFile
	keyFile := common.ServerCfg.CertKey

	// 设置tls信息
	tlsConfig := &tls.Config{
		NextProtos: []string{"http/1.1"},
		MinVersion: tls.VersionTLS12,
	}
	srv := &http.Server{
		Addr:      addr,
		Handler:   initRoute(),
		TLSConfig: tlsConfig,
	}

	var ln net.Listener

	ln, err := net.Listen("tcp", addr)
	if err != nil {
		log.Fatal(err)
	}
	defer ln.Close()

	if common.ServerCfg.ProxyProtocol {
		ln = &proxyproto.Listener{Listener: ln, ProxyHeaderTimeout: time.Second * 5}
	}

	fmt.Println("listen ", addr)
	err = srv.ServeTLS(ln, certFile, keyFile)
	if err != nil {
		log.Fatal(err)
	}
}

func initRoute() http.Handler {
	router := httprouter.New()
	router.GET("/", checkVpnClient(LinkHome))
	router.POST("/", checkVpnClient(LinkAuth))
	router.HandlerFunc("CONNECT", "/CSCOSSLC/tunnel", LinkTunnel)
	router.NotFound = http.HandlerFunc(notFound)
	return router
}

func notFound(w http.ResponseWriter, r *http.Request) {
	hu, _ := httputil.DumpRequest(r, true)
	fmt.Println("NotFound: ", string(hu))

	w.WriteHeader(http.StatusNotFound)
	fmt.Fprintln(w, "404 page not found")
}