package main

import (
	"log"
	"os"

	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/middleware/logger"
	"github.com/gofiber/fiber/v2/middleware/recover"

	"server/apis/handlers"
	"server/apis/middleware"
	"server/apis/services"
	"server/apis/socketio"
	"server/config"
)

func main() {
	// Config yükleme
	if err := config.LoadEnv(); err != nil {
		log.Fatalf("Çevresel değişkenler yüklenemedi: %v", err)
	}

	// MongoDB bağlantısı
	client, db, err := services.ConnectMongoDB()
	if err != nil {
		log.Fatalf("MongoDB bağlantı hatası: %v", err)
	}
	defer client.Disconnect(nil)

	// Socket.io başlatma
	socket := socketio.SetupSocketIO()

	// Fiber uygulaması
	app := fiber.New()
	app.Use(logger.New())
	app.Use(recover.New())

	// Session store setup
	sessionStore := middleware.SetupSessionStore(db)

	// API rotaları
	api := app.Group("/api")
	api.Get("/health", handlers.HealthCheck)
	api.Post("/login", handlers.Login(sessionStore))
	api.Post("/logout", handlers.Logout(sessionStore))
	api.Post("/upload", middleware.SessionMiddleware(sessionStore), handlers.UploadFile(db, socket))

	// Socket.io bağlantısı
	app.Get("/socket.io/", socket.HandleRequest)
	app.Post("/socket.io/", socket.HandleRequest)

	// SSL ile sunucu başlatma
	port := os.Getenv("PORT")
	if port == "" {
		port = "3000"
	}
	log.Printf("Sunucu %s portunda çalışıyor...", port)

	// SSL Sertifikası ve Anahtarı yolu
	certFile := "./cert/server.crt"
	keyFile := "./cert/server.key"

	// HTTPS üzerinden başlatma
	if err := app.ListenTLS(":"+port, certFile, keyFile); err != nil {
		log.Fatalf("Sunucu başlatılamadı: %v", err)
	}
}
