package FikoYTCtx

import (
	"fmt"
	"server/sistem/FikoYTDosya"
	FikoYTCevap "server/sistem/fikoyt_ctx/fikoyt_cevap"
	FikoYTHata "server/sistem/fikoyt_ctx/fikoyt_hata"
	FikoYTIstek "server/sistem/fikoyt_ctx/fikoyt_istek"
	"server/sistem/fikoyt_json"
	fiko_mongo "server/sistem/fikoyt_mongo"
	fiko_socket_io "server/sistem/fikoyt_socket_io"

	"github.com/gofiber/fiber/v3"
	recoverer "github.com/gofiber/fiber/v3/middleware/recover"
	"github.com/gofiber/fiber/v3/middleware/requestid"
	"github.com/gofiber/fiber/v3/middleware/session"
	"github.com/zishang520/socket.io/v2/socket"
	"go.mongodb.org/mongo-driver/mongo"
)

/**/

/**/
type FikoYTCtx struct {
	Istek *FikoYTIstek.FikoYTIstek
	// Json         FikoYTMap.FikoYTMap
	// Dosyalar     []FikoYTDosya.FileInfo
	// Ip           string
	// FapiKomut    string
	CevapHatalar FikoYTHata.ArrayFikoYTHata
	Sezon        *session.Session
	Koleksiyon   func(koleksiyonIsmi string) *mongo.Collection
}

func Ayarla(app *fiber.App) {
	// app.NewCtxFunc(func(app1 *fiber.App) fiber.CustomCtx {
	// 	return &Ctx{
	// 		Ctx: fiber.NewDefaultCtx(app1),
	// 	}
	// })
	app.Use(fikoyt_json.AraIsleyici())
	app.Use(FikoYTDosya.AraIsleyici())
	FikoYTCevap.Ayarla(app)
	app.Use(requestid.New())
	app.Use(recoverer.New())
	fiko_mongo.Init(app)
	app.Use(araIsleyici())

}

func araIsleyici() fiber.Handler {
	return func(c fiber.Ctx) error {
		// files, _ := c.Locals("files").([]FikoYTDosya.FileInfo)
		// json, _ := c.Locals("json").(FikoYTMap.FikoYTMap)
		sezon, _ := c.Locals("session").(*session.Session)
		/**/
		fmt.Println(c.GetReqHeaders()["fsid"])
		/**/
		fkCtx := &FikoYTCtx{
			Istek:        FikoYTIstek.Yeni(c),
			Sezon:        sezon,
			Koleksiyon:   FikoYTCollection,
			CevapHatalar: FikoYTHata.ArrayFikoYTHata{},
		}

		c.Locals("FikoYTCtx", fkCtx)
		return c.Next() // Sonraki handler'ı çağır
	}
}

func FikoYTCollection(koleksiyonIsmi string) *mongo.Collection {
	return fiko_mongo.GetMongoDBClient().Database("fikoyt").Collection(koleksiyonIsmi)
}

func getSocket(sid *string) *socket.Socket {
	var rslt *socket.Socket = nil
	fiko_socket_io.FikoSocketIo.FetchSockets()(func(sockets []*socket.RemoteSocket, _ error) {
		for _, v := range sockets {
			if v.Id() == socket.SocketId(sid) {
				rslt = v
			}
		}
	})
	return rslt
}
