package http_server

import (
	"fmt"
	log "github.com/sirupsen/logrus"
	"io/fs"
	"net/http"
	"pmail/config"
	"pmail/controllers"
	"pmail/controllers/email"
	"pmail/session"
	"time"
)

// 这个服务是为了拦截http请求转发到https
var httpServer *http.Server

func HttpStop() {
	if httpServer != nil {
		httpServer.Close()
	}
}

func HttpStart() {
	mux := http.NewServeMux()

	HttpPort := 80
	if config.Instance.HttpPort > 0 {
		HttpPort = config.Instance.HttpPort
	}

	if config.Instance.HttpsEnabled != 2 {
		mux.HandleFunc("/", controllers.Interceptor)
		httpServer = &http.Server{
			Addr:         fmt.Sprintf(":%d", HttpPort),
			Handler:      mux,
			ReadTimeout:  time.Second * 90,
			WriteTimeout: time.Second * 90,
		}
	} else {
		fe, err := fs.Sub(local, "dist")
		if err != nil {
			panic(err)
		}
		mux.Handle("/", http.FileServer(http.FS(fe)))
		// 挑战请求类似这样 /.well-known/acme-challenge/QPyMAyaWw9s5JvV1oruyqWHG7OqkHMJEHPoUz2046KM
		mux.HandleFunc("/.well-known/", controllers.AcmeChallenge)
		mux.HandleFunc("/api/ping", contextIterceptor(controllers.Ping))
		mux.HandleFunc("/api/login", contextIterceptor(controllers.Login))
		mux.HandleFunc("/api/group", contextIterceptor(controllers.GetUserGroup))
		mux.HandleFunc("/api/group/list", contextIterceptor(controllers.GetUserGroupList))
		mux.HandleFunc("/api/group/add", contextIterceptor(controllers.AddGroup))
		mux.HandleFunc("/api/group/del", contextIterceptor(controllers.DelGroup))
		mux.HandleFunc("/api/email/list", contextIterceptor(email.EmailList))
		mux.HandleFunc("/api/email/del", contextIterceptor(email.EmailDelete))
		mux.HandleFunc("/api/email/read", contextIterceptor(email.MarkRead))
		mux.HandleFunc("/api/email/detail", contextIterceptor(email.EmailDetail))
		mux.HandleFunc("/api/email/move", contextIterceptor(email.Move))
		mux.HandleFunc("/api/email/send", contextIterceptor(email.Send))
		mux.HandleFunc("/api/settings/modify_password", contextIterceptor(controllers.ModifyPassword))
		mux.HandleFunc("/api/rule/get", contextIterceptor(controllers.GetRule))
		mux.HandleFunc("/api/rule/add", contextIterceptor(controllers.UpsertRule))
		mux.HandleFunc("/api/rule/update", contextIterceptor(controllers.UpsertRule))
		mux.HandleFunc("/api/rule/del", contextIterceptor(controllers.DelRule))
		mux.HandleFunc("/attachments/", contextIterceptor(controllers.GetAttachments))
		mux.HandleFunc("/attachments/download/", contextIterceptor(controllers.Download))
		log.Infof("HttpServer Start On Port :%d", HttpPort)
		httpServer = &http.Server{
			Addr:         fmt.Sprintf(":%d", HttpPort),
			Handler:      session.Instance.LoadAndSave(mux),
			ReadTimeout:  time.Second * 90,
			WriteTimeout: time.Second * 90,
		}
	}

	err := httpServer.ListenAndServe()
	if err != nil {
		panic(err)
	}
}
