package application

import (
	"context"
	"net/http"

	"github.com/go-chi/chi/v5"
	"github.com/go-chi/cors"
	httpSwagger "github.com/swaggo/http-swagger"
)

type SwaggerConf struct {
	Enabled     bool
	Addr        string
	URI         string
	Prefix      string
	SSL         bool
	TLSKeyPath  string
	TLSCertPath string
}

func NewSwagger(conf *SwaggerConf) *Swagger {
	swagger := &Swagger{
		conf: conf,
	}
	return swagger
}

type Swagger struct {
	conf   *SwaggerConf
	ctx    context.Context
	cancel context.CancelFunc
	server *http.Server
}

func (s *Swagger) Start(ctx context.Context) {
	r := chi.NewRouter()
	cors := cors.New(cors.Options{
		AllowedOrigins:   []string{"*"}, // Разрешить все домены, для продакшена лучше указать конкретные домены
		AllowedMethods:   []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
		AllowedHeaders:   []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
		ExposedHeaders:   []string{"Link"},
		AllowCredentials: false,
		MaxAge:           300, // Максимальный срок предварительного кэширования (в секундах)
	})
	r.Use(cors.Handler)
	// Настройка сервера для обслуживания содержимого директории docs
	fileServer := http.FileServer(http.Dir("./docs"))
	r.Handle("/docs/*", http.StripPrefix("/docs", fileServer))
	r.Get(s.conf.Prefix, httpSwagger.Handler(
		httpSwagger.URL(s.conf.URI), //The url pointing to API definition
	))
	s.server = &http.Server{
		Addr:    s.conf.Addr,
		Handler: r,
	}
	s.ctx, s.cancel = context.WithCancel(ctx)
	go func() {
		<-s.ctx.Done()
		s.Stop()
	}()
	if s.conf.SSL {
		s.server.ListenAndServeTLS(s.conf.TLSCertPath, s.conf.TLSKeyPath)
	} else {
		s.server.ListenAndServe()
	}
	//http.ListenAndServe(s.conf.Addr, r)
}

func (s *Swagger) Stop() {
	s.cancel()
}