package main

import (
	"log"
	"os"
	fikoyt_api "server/apps/fikoyt_api"
	guncelleme "server/apps/guncelleme"
	lisans_kontrol "server/apps/lisans_kontrol"
	mail_dinleyici "server/apps/mail_dinleyici"
	rag "server/apps/rag"
	uyar_app_main "server/apps/uyar_dokum/uyar"
	// yuz_tanima "server/apps/yuz_tanima" // geçici deaktif

	FikoYTCtx "server/sistem/fikoyt_ctx"
	fiko_socket_io "server/sistem/fikoyt_socket_io"
	"server/sistem/kok"
	"server/sistem/kokDB"
	"server/sistem/socket_ortak"

	"github.com/gofiber/fiber/v3"
	recoverer "github.com/gofiber/fiber/v3/middleware/recover"
	"github.com/sinemah/jsonenv"
	"go.mongodb.org/mongo-driver/bson"
)

func main() {
	err := jsonenv.Load("fikoyt.env.json")
	if err != nil {
		log.Fatal(err)
	}

	app := fiber.New(fiber.Config{AppName: os.Getenv("uyg_adi") /* ErrorHandler: GlobalErrorHandler,*/, StreamRequestBody: true, Immutable: true, BodyLimit: 2000 * 1024 * 1024})
	app.Use(recoverer.New())

	// COOP/COEP headers - SharedArrayBuffer & WASM threads desteği için
	app.Use(func(c fiber.Ctx) error {
		c.Set("Cross-Origin-Opener-Policy", "same-origin")
		c.Set("Cross-Origin-Embedder-Policy", "require-corp")
		return c.Next()
	})

	// Push Service Worker - statik dosya
	app.Get("/push-sw.js", func(c fiber.Ctx) error {
		c.Set("Content-Type", "application/javascript")
		c.Set("Service-Worker-Allowed", "/")
		return c.SendString(`self.addEventListener('push',function(e){var d={};try{d=e.data?e.data.json():{};}catch(x){d={};}e.waitUntil(self.registration.showNotification(d.baslik||'FikoYT',{body:d.mesaj||'Yeni bildirim',icon:'/simgeler/logo.webp',badge:'/simgeler/logo.webp',tag:d.tag||'fikoyt-bildirim',renotify:true,data:{url:d.url||'/'}}));});self.addEventListener('notificationclick',function(e){e.notification.close();var u=(e.notification.data&&e.notification.data.url)||'/';e.waitUntil(clients.matchAll({type:'window',includeUncontrolled:true}).then(function(cl){for(var i=0;i<cl.length;i++){if(cl[i].url.indexOf(self.location.origin)!==-1&&'focus' in cl[i]){cl[i].navigate(u);return cl[i].focus();}}return clients.openWindow(u);}));});`)
	})

	FikoYTCtx.Ayarla(app)
	/**/
	fiko_socket_io.Ayarla(app)
	uyar_app_main.Ayarla(app)
	fikoyt_api.Ayarla(app) // FikoYT Ajan Sistemi API
	// yuz_tanima.Ayarla(app) // Yüz Tanıma Sistemi (GPU) — geçici olarak deaktif
	rag.Ayarla(app)        // RAG + MCP Sistemi
	guncelleme.Ayarla(app) // Native uygulama otomatik güncelleme (manifest + paket)
	lisans_kontrol.Ayarla(app) // FikoCAD canlı lisans kontrolü (/lisans-ws + /lisans-kontrol paneli)

	// Tetikleyici Motor - kural tabanlı olay işleme
	uyar_app_main.TetikleyiciMotorOrnek.Baslat()

	// Mail Dinleyici - IMAP IDLE/Polling
	mail_dinleyici.Baslat(func(event string, data interface{}) {
		if socket_ortak.FikoSocketIo != nil {
			socket_ortak.FikoSocketIo.Emit(event, data)
		}
		// Mail senkronizasyon tamamlandığında tetikleyici motora ilet
		if dataMap, ok := data.(bson.M); ok {
			if tip, _ := dataMap["tip"].(string); tip == "tamamlandi" {
				toplam := 0
				switch v := dataMap["toplam"].(type) {
				case int:
					toplam = v
				case int64:
					toplam = int(v)
				case float64:
					toplam = int(v)
				}
				if toplam > 0 {
					email, _ := dataMap["email"].(string)
					klasor, _ := dataMap["klasor"].(string)
					go uyar_app_main.TetikleyiciMotorOrnek.OlayIsle(map[string]interface{}{
						"olay_kodu":    "mail_geldi",
						"cihaz_kimlik": "mail-dinleyici",
						"gonderen":     email,
						"toplam":       toplam,
						"klasor":       klasor,
					})
				}
			}
		}
	})

	kok.KokRouting(app)

	kokDB.KokDBRouting(app)

	runSslWithPrefork(app)
}

func runSslWithPrefork(app *fiber.App) {
	// SSL sertifikası yükleniyor
	// cert, err := tls.LoadX509KeyPair("cert/server.crt", "cert/server.key")
	// if err != nil {
	// 	log.Fatalf("SSL Sertifikası yüklenirken hata oluştu: %v", err)
	// }

	// TLS yapılandırması
	// tlsConfig := &tls.Config{
	// 	Certificates: []tls.Certificate{cert},
	// }

	// ListenConfig kullanılarak sunucu başlatılıyor
	app.Listen(":"+os.Getenv("port_as_string"), fiber.ListenConfig{
		CertFile:    "cert/server.crt",
		CertKeyFile: "cert/server.key",

		EnablePrefork:     false, // Tek process - stabil
		EnablePrintRoutes: true,

	})
}

// func GlobalErrorHandler(c fiber.Ctx, err error) error {
// 	if err == nil {
// 		return c.Status(fiber.StatusInternalServerError).SendString("An unknown error occurred")
// 	}

// 	// Fiber özel hatalarını yönet
// 	if e, ok := err.(*fiber.Error); ok {
// 		return c.Status(e.Code).SendString(e.Message)
// 	}

// 	// Genel hatalar için
// 	log.Printf("Unhandled error: %v", err)
// 	return c.Status(fiber.StatusInternalServerError).SendString("Internal server error")
// }
