package kok

import (
	"context"
	"encoding/json"
	"fmt"
	"image"
	"image/color"
	"image/jpeg"
	"image/png"
	"io"
	"log"
	"os"
	"regexp"
	"runtime/debug"
	"server/sistem/FikoYTDosya"
	FikoYTCtx "server/sistem/fikoyt_ctx"
	FikoYTHata "server/sistem/fikoyt_ctx/fikoyt_hata"
	FikoYTMap "server/sistem/fikoyt_map"
	fiko_mongo "server/sistem/fikoyt_mongo"
	"strconv"
	"strings"

	"github.com/disintegration/imaging"
	"github.com/gofiber/fiber/v3"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo/gridfs"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func fikoyt_sistem_giris_yap(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	// fmt.Println(FikoYT.Istek.Json)
	bosalanlar := FikoYT.Istek.Json.BosAlanlar()
	if len(bosalanlar) > 0 {
		for i := 0; i < len(bosalanlar); i++ {
			bosalan := bosalanlar[i]
			FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataBosHatasi(bosalan).FikoYTHata)
		}
	}

	///
	kullaniciAdi := FikoYT.Istek.Json["kullaniciAdi"]
	var kytUye FikoYTMap.FikoYTMap
	goUyeler := FikoYT.Koleksiyon("goUyeler")
	if kullaniciAdi != nil {

		_ = goUyeler.FindOne(context.TODO(), fiber.Map{"kullaniciAdi": kullaniciAdi, "silindi": FikoYTMap.FikoYTMap{"$ne": true}}).Decode(&kytUye)
		if kytUye == nil {
			FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataKullaniciBulunamadiHatasi(kullaniciAdi.(string)).FikoYTHata)
		} else {
			sifreDogru := SifreDogrula(FikoYT.Istek.Json["parola"].(string), kytUye["parola"].(string))

			if !sifreDogru {
				FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataParolaHataliHatasi().FikoYTHata)
			} else {
				FikoYT.Sezon.Set("aktifKullaniciID", kytUye["_id"].(primitive.ObjectID).Hex())
				FikoYT.Sezon.Save()
			}

		}
	}

	///

	if len(FikoYT.Cevap.Durum.Hatalar) > 0 {
		FikoYT.Cevap.AyarlaDurumKodu(499)
		FikoYT.Cevap.Durum.Hata = true

		return nil
	}

	///
	// FikoYT.Cevap.Sonuc = nil
	FikoYT.Cevap.AyarlaDurumKodu(200)

	var sncKyt FikoYTMap.FikoYTMap
	_ = goUyeler.FindOne(context.TODO(), fiber.Map{"_id": kytUye["_id"], "silindi": FikoYTMap.FikoYTMap{"$ne": true}}, &options.FindOneOptions{Projection: fiber.Map{"parola": 0, "epostaOnayKodu": 0, "anlasma": 0, "aktifDurum": 0}}).Decode(&sncKyt)
	// if sncKyt == nil {
	// 	return nil
	// }

	FikoYT.Cevap.Sonuc = sncKyt

	return c.Status(200).JSON(sncKyt)
}

/***/
func fikoyt_sistem_cikis_yap(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	FikoYT.Sezon.Set("aktifKullaniciID", nil)
	FikoYT.Sezon.Save()

	///
	// FikoYT.Cevap.Sonuc = nil
	FikoYT.Cevap.AyarlaDurumKodu(200)

	FikoYT.Cevap.Sonuc = true

	// fmt.Println(FikoYT.Sezon.Get("aktifKullaniciID").(string))

	return c.Status(200).JSON(true)
}

/***/
func fikoyt_sistem_uye_ol(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	// if len(FikoYT.Istek.Dosyalar) > 0 {
	// 	dosya := FikoYT.Istek.Dosyalar[0]
	// 	dosya.Kaydet()
	// 	dosya.Isle()
	// 	dosya.KaydetGridFs(fiber.Map{"test": "deneme"})
	// 	dosya.TemizleDosyalar()
	// }

	// if true {
	// 	return nil
	// }
	bosalanlar := FikoYT.Istek.Json.BosAlanlar()
	if len(bosalanlar) > 0 {
		for i := 0; i < len(bosalanlar); i++ {
			bosalan := bosalanlar[i]
			FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataTurHatasi(bosalan).FikoYTHata)
		}

		// FikoYT.Cevap.AyarlaDurumKodu(499)
		// FikoYT.Cevap.Durum.Hata = true

		// return nil
	}

	// Birden fazla hata örneği
	if FikoYT.Istek.Json["anlasma"] == false && FikoYT.Istek.Json["anlasmaOnaylama"] == nil {
		FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataAnlasmaOnaylama().FikoYTHata)
	}

	///
	epostaPattern := `^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$`
	matched, _ := regexp.MatchString(epostaPattern, FikoYT.Istek.Json["ePosta"].(string))

	if !matched {
		FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataTurHatasi("E-Posta").FikoYTHata)
	}

	///

	if FikoYT.Istek.Json["parola"] != FikoYT.Istek.Json["parolaTekrar"] {
		if FikoYT.Istek.Json["parola"] != "" || FikoYT.Istek.Json["parolaTekrar"] != "" {
			FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataAyniDegilHatasi("Parola", "Parola Tekrar", nil).FikoYTHata)
		}
	}
	///
	kullaniciAdi := FikoYT.Istek.Json["kullaniciAdi"]
	goUyeler := FikoYT.Koleksiyon("goUyeler")
	if kullaniciAdi != nil {
		var kytUye FikoYTMap.FikoYTMap
		_ = goUyeler.FindOne(context.TODO(), fiber.Map{"kullaniciAdi": kullaniciAdi}).Decode(&kytUye)
		if kytUye != nil {
			FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataKullaniciMevcutHatasi(kullaniciAdi.(string), nil).FikoYTHata)
		}
	}
	///
	eposta := FikoYT.Istek.Json["ePosta"]
	if eposta != nil {
		var kytEposta FikoYTMap.FikoYTMap
		_ = goUyeler.FindOne(context.TODO(), fiber.Map{"ePosta": eposta}).Decode(&kytEposta)
		if kytEposta != nil {
			FikoYT.Cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataEPostaMevcutHatasi(eposta.(string), nil).FikoYTHata)
		}
	}
	///

	if len(FikoYT.Cevap.Durum.Hatalar) > 0 {
		FikoYT.Cevap.AyarlaDurumKodu(499)
		FikoYT.Cevap.Durum.Hata = true

		return nil
	}

	///
	// FikoYT.Cevap.Sonuc = nil
	FikoYT.Cevap.AyarlaDurumKodu(200)

	FikoYT.Istek.Json["aktifDurum"] = "Aktif"

	FikoYT.Istek.Json["parola"] = ParolaSifrele(FikoYT.Istek.Json["parola"].(string))
	delete(FikoYT.Istek.Json, "parolaTekrar")

	epostaOnayKodu := EpostaOnayKoduFonksiyonu(FikoYT.Istek.Json["isim"].(string), FikoYT.Istek.Json["soyIsim"].(string), FikoYT.Istek.Json["kullaniciAdi"].(string))

	FikoYT.Istek.Json["epostaOnayKodu"] = epostaOnayKodu

	rslt, _ :=
		goUyeler.InsertOne(context.TODO(), FikoYT.Istek.Json)

	if len(FikoYT.Istek.Dosyalar) > 0 {
		dosya := FikoYT.Istek.Dosyalar[0]
		dosya.Kaydet()
		dosya.Isle()
		dosya.KaydetGridFs(fiber.Map{"yol": "./profilResimleri", "kid": rslt.InsertedID})

		dosya.TemizleDosyalar()

	}
	FikoYT.Cevap.Sonuc = true

	return c.Status(200).JSON(true)
}

func fikoyt_sistem_dosyalar_id_resim(c fiber.Ctx) error {

	objectIDStr := c.Params("id")

	if objectIDStr == "" {
		return c.SendFile("statik/users.png")
	}

	objectID, err := primitive.ObjectIDFromHex(objectIDStr)
	if err != nil {
		return c.SendFile("statik/users.png")
	}

	// GridFS'den dosya okuyun
	fsName := "go_files"
	bucket, err := gridfs.NewBucket(fiko_mongo.GetMongoDBClient().Database("fikoyt"), &options.BucketOptions{Name: &fsName})
	if err != nil {
		return c.SendFile("statik/users.png")
	}

	stream, err := bucket.OpenDownloadStream(objectID)
	if err != nil {
		return c.SendFile("statik/users.png")
	}
	defer stream.Close()

	// Resmi oku
	img, format, err := image.Decode(stream)
	if err != nil {
		return c.SendFile("statik/users.png")
	}

	// Efektler ve ayarlamalar
	// Boyutlandırma
	boyut := c.Query("boyut")
	var width, height int
	if boyut != "" {
		dimensions := strings.Split(boyut, "x")

		// Eğer her iki boyut verilmişse
		if len(dimensions) == 2 {
			// Bir boyut "?" olabilir
			if dimensions[0] == "?" {
				// Yalnızca yükseklik verildi, genişlik hesaplanacak
				height, _ = strconv.Atoi(dimensions[1])
				imgWidth := img.Bounds().Dx()
				imgHeight := img.Bounds().Dy()
				aspectRatio := float64(imgWidth) / float64(imgHeight)
				width = int(float64(height) * aspectRatio)
			} else if dimensions[1] == "?" {
				// Yalnızca genişlik verildi, yükseklik hesaplanacak
				width, _ = strconv.Atoi(dimensions[0])
				imgWidth := img.Bounds().Dx()
				imgHeight := img.Bounds().Dy()
				aspectRatio := float64(imgHeight) / float64(imgWidth)
				height = int(float64(width) * aspectRatio)
			} else {
				// Hem genişlik hem de yükseklik verildi
				width, _ = strconv.Atoi(dimensions[0])
				height, _ = strconv.Atoi(dimensions[1])
			}
		} else if len(dimensions) == 1 {
			// Sadece bir boyut verildiyse, diğer boyut orantılı olarak hesaplanacak
			if strings.Contains(dimensions[0], "?") {
				// ? işareti var, orantılı olarak hesaplanacak
				if strings.Contains(dimensions[0], "x") {
					height = -1
					width, _ = strconv.Atoi(strings.Replace(dimensions[0], "?", "", 1))
				} else {
					width = -1
					height, _ = strconv.Atoi(strings.Replace(dimensions[0], "?", "", 1))
				}
			} else {
				// Eğer tek bir boyut verildiyse, her iki boyut eşit olacak şekilde ayarlanacak
				width, _ = strconv.Atoi(dimensions[0])
				height = width

			}
		}

		// Resmin orijinal boyutları
		imgWidth := img.Bounds().Dx()
		imgHeight := img.Bounds().Dy()

		if width > 2048 {
			width = 2048
		}
		if height > 2048 {
			height = 2048
		}
		// Boyutlandırma işlemi
		if width > 0 && height > 0 {
			img = imaging.Resize(img, width, height, imaging.Lanczos)
		} else if width > 0 && height == -1 {
			// Sadece width verildi, orantılı olarak height hesaplanacak
			aspectRatio := float64(imgHeight) / float64(imgWidth)
			height = int(float64(width) * aspectRatio)
			img = imaging.Resize(img, width, height, imaging.Lanczos)
		} else if height > 0 && width == -1 {
			// Sadece height verildi, orantılı olarak width hesaplanacak
			aspectRatio := float64(imgWidth) / float64(imgHeight)
			width = int(float64(height) * aspectRatio)
			img = imaging.Resize(img, width, height, imaging.Lanczos)
		}
	}

	// Thumbnail oluşturma
	if c.Query("thumbnail") == "true" {
		img = imaging.Thumbnail(img, 150, 150, imaging.Lanczos)
	}

	// Grayscale
	if c.Query("grayscale") == "true" {
		img = imaging.Grayscale(img)
	}

	// Blur
	if blurRadiusStr := c.Query("blur"); blurRadiusStr != "" {
		blurRadius, _ := strconv.ParseFloat(blurRadiusStr, 64)
		if blurRadius > 0 {
			img = imaging.Blur(img, blurRadius)
		}
	}

	// Rotate
	if rotateAngleStr := c.Query("rotate"); rotateAngleStr != "" {
		rotateAngle, _ := strconv.Atoi(rotateAngleStr)
		img = imaging.Rotate(img, float64(rotateAngle), color.Transparent)
	}

	// Flip
	if flip := c.Query("flip"); flip != "" {
		if flip == "horizontal" {
			img = imaging.FlipH(img)
		} else if flip == "vertical" {
			img = imaging.FlipV(img)
		}
	}

	// Brightness
	if brightnessStr := c.Query("brightness"); brightnessStr != "" {
		brightness, _ := strconv.ParseFloat(brightnessStr, 64)
		if brightness != 0 {
			img = imaging.AdjustBrightness(img, brightness)
		}
	}

	// Contrast
	if contrastStr := c.Query("contrast"); contrastStr != "" {
		contrast, _ := strconv.ParseFloat(contrastStr, 64)
		if contrast != 0 {
			img = imaging.AdjustContrast(img, contrast)
		}
	}

	// Sharpness
	if sharpnessStr := c.Query("sharpness"); sharpnessStr != "" {
		sharpness, _ := strconv.ParseFloat(sharpnessStr, 64)
		if sharpness != 0 {
			img = imaging.Sharpen(img, sharpness)
		}
	}

	// Sepia
	if c.Query("sepia") == "true" {
		img = imaging.AdjustSaturation(img, -1)
		img = imaging.AdjustContrast(img, 30)
		img = imaging.AdjustBrightness(img, 20)
	}

	// Saturation
	if saturationStr := c.Query("saturation"); saturationStr != "" {
		saturation, _ := strconv.ParseFloat(saturationStr, 64)
		if saturation != 0 {
			img = imaging.AdjustSaturation(img, saturation)
		}
	}

	// Crop
	if cropStr := c.Query("crop"); cropStr != "" {
		parts := strings.Split(cropStr, ",")
		if len(parts) == 4 {
			x, _ := strconv.Atoi(parts[0])
			y, _ := strconv.Atoi(parts[1])
			w, _ := strconv.Atoi(parts[2])
			h, _ := strconv.Atoi(parts[3])
			if w > 0 && h > 0 {
				img = imaging.Crop(img, image.Rect(x, y, x+w, y+h))
			}
		}
	}

	// Negative
	if c.Query("negative") == "true" {
		img = imaging.Invert(img)
	}

	// Hue Rotation
	if hueStr := c.Query("hue"); hueStr != "" {
		hue, _ := strconv.ParseFloat(hueStr, 64)
		if hue != 0 {
			img = imaging.AdjustSaturation(img, hue)
		}
	}

	// Watermark ekleme
	if watermarkStr := c.Query("watermark"); watermarkStr != "" {
		// Henüz bir watermark ekleme örneği yapılmadı, ancak overlay işlemi burada yapılabilir.
	}

	// Sıkıştırma işlemleri (JPEG kalitesi)
	quality := 80 // Varsayılan kalite
	if qualityStr := c.Query("quality"); qualityStr != "" {
		parsedQuality, _ := strconv.Atoi(qualityStr)
		if parsedQuality > 0 && parsedQuality <= 100 {
			quality = parsedQuality
		}
	}

	// Yanıt içerik türünü ayarla
	contentType := "image/jpeg"
	if format == "png" {
		contentType = "image/png"
	}
	c.Set("Content-Type", contentType)

	// İşlenmiş resmi yanıt olarak gönder
	if contentType == "image/jpeg" {
		options := &jpeg.Options{Quality: quality}
		return jpeg.Encode(c.Response().BodyWriter(), img, options)
	} else if contentType == "image/png" {
		return png.Encode(c.Response().BodyWriter(), img)
	}

	debug.FreeOSMemory()
	return c.SendFile("statik/users.png")
}

func fikoyt_sistem_kullanici_profil_resmi(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	objectIDStr := c.Params("kid")

	if objectIDStr == "" {
		return c.SendFile("statik/users.png")
	}
	objectID, err := primitive.ObjectIDFromHex(objectIDStr)
	if err != nil {
		return c.SendFile("statik/users.png")
	}
	goUyeler := FikoYT.Koleksiyon("goUyeler")
	var kytUye FikoYTMap.FikoYTMap
	_ = goUyeler.FindOne(context.TODO(), fiber.Map{"_id": objectID}).Decode(&kytUye)

	if kytUye == nil {
		return c.SendFile("statik/users.png")
	}

	if kytUye["profilResmi"] == nil {
		return c.SendFile("statik/users.png")
	}

	return c.Redirect().To("/fapiv1/fikoyt.com.FikoYT.sistem.dosyalar." + kytUye["profilResmi"].(primitive.ObjectID).Hex() + ".resim?" + c.Request().URI().QueryArgs().String())
	// https://fikoyt.com:3000/fikoyt.com.FikoYT.sistem.kullanici.6766beb34ae4043565481482.profilResmi?boyut=40
}

func fikoyt_sistem_aktif_kullanici_profil_resmi(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	objectIDStr := FikoYT.Sezon.Get("aktifKullaniciID")

	if objectIDStr == "" {
		return c.SendFile("statik/users.png")
	}

	if objectIDStr == nil {
		return c.SendFile("statik/users.png")
	}

	objectID, err := primitive.ObjectIDFromHex(objectIDStr.(string))
	if err != nil {
		return c.SendFile("statik/users.png")
	}
	goUyeler := FikoYT.Koleksiyon("goUyeler")
	var kytUye FikoYTMap.FikoYTMap
	_ = goUyeler.FindOne(context.TODO(), fiber.Map{"_id": objectID}).Decode(&kytUye)

	if kytUye == nil {
		return c.SendFile("statik/users.png")
	}

	if kytUye["profilResmi"] == nil {
		return c.SendFile("statik/users.png")
	}
	return c.Redirect().To("/fapiv1/fikoyt.com.FikoYT.sistem.dosyalar." + kytUye["profilResmi"].(primitive.ObjectID).Hex() + ".resim?" + c.Request().URI().QueryArgs().String())
	// https://fikoyt.com:9000/fikoyt.com.FikoYT.sistem.aktif-kullanici.profilResmi?boyut=40
}

func fikoyt_sistem_kullanici_profil_resmi_degistir(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	objectIDStr := c.Params("kid")

	if objectIDStr == "" {
		return nil
	}
	objectID, err := primitive.ObjectIDFromHex(objectIDStr)
	if err != nil {
		return nil
	}
	goUyeler := FikoYT.Koleksiyon("goUyeler")
	var kytUye FikoYTMap.FikoYTMap
	_ = goUyeler.FindOne(context.TODO(), fiber.Map{"_id": objectID}).Decode(&kytUye)
	// goUyeler.Aggregate(context.TODO(), []FikoYTMap.FikoYTMap{})

	if kytUye == nil {
		return nil
	}

	if len(FikoYT.Istek.Dosyalar) <= 0 {

		return nil
	}

	kytUye.IsleObjectId()
	if kytUye["profilResmi"] != nil {
		FikoYTDosya.DeleteFromGridfs(kytUye["profilResmi"].(primitive.ObjectID))
	}
	// if len(FikoYT.Istek.Dosyalar) > 0 {
	dosya := FikoYT.Istek.Dosyalar[0]
	dosya.Kaydet()
	dosya.Isle()
	dosya.KaydetGridFs(fiber.Map{"yol": "./profilResimleri", "kid": kytUye["_id"].(primitive.ObjectID)})
	dosya.TemizleDosyalar()
	fileid, _ := primitive.ObjectIDFromHex(string(dosya.Id.Hex()))
	_, _ = goUyeler.UpdateByID(context.TODO(), objectID, fiber.Map{"$set": fiber.Map{"profilResmi": fileid}})

	return nil

}

func fikoyt_sistem_kullanici_profil_resmi_sil(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	objectIDStr := c.Params("kid")

	if objectIDStr == "" {
		return nil
	}

	objectID, err := primitive.ObjectIDFromHex(objectIDStr)
	if err != nil {
		return nil
	}

	goUyeler := FikoYT.Koleksiyon("goUyeler")
	var kytUye FikoYTMap.FikoYTMap
	_ = goUyeler.FindOne(context.TODO(), fiber.Map{"_id": objectID}).Decode(&kytUye)

	// goUyeler.Aggregate(context.TODO(), []FikoYTMap.FikoYTMap{})

	if kytUye == nil {
		return nil
	}

	if kytUye["profilResmi"] == nil {
		return nil
	}
	// if len(FikoYT.Istek.Dosyalar) <= 0 {
	// 	return nil
	// }

	// kytUye.IsleObjectId()
	FikoYTDosya.DeleteFromGridfs(kytUye["profilResmi"].(primitive.ObjectID))

	// if len(FikoYT.Istek.Dosyalar) > 0 {
	// dosya := FikoYT.Istek.Dosyalar[0]
	// dosya.Kaydet()
	// dosya.Isle()
	// dosya.KaydetGridFs(fiber.Map{"yol": "./profilResimleri", "kid": kytUye["_id"].(primitive.ObjectID)})
	// dosya.TemizleDosyalar()
	// fileid, _ := primitive.ObjectIDFromHex(dosya.File.Filename)
	_, err = goUyeler.UpdateOne(context.TODO(), fiber.Map{"_id": objectID}, fiber.Map{"$set": fiber.Map{"profilResmi": nil}})
	if err != nil {
		fmt.Println(err.Error())
	}
	return nil

}

func fikoyt_sistem_test(c fiber.Ctx) error {

	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	if len(FikoYT.Istek.Dosyalar) > 0 {
		dosya := FikoYT.Istek.Dosyalar[0]
		log.Printf("%s", FikoYT.Istek.FapiKomut)
		dosya.Kaydet()
		dosya.Isle()

		// dosya.TemizleDosyalar()
	}

	return nil
}

func fikoyt_sistem_aktif_kullanici_bilgi(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	objectIDStr := FikoYT.Sezon.Get("aktifKullaniciID")

	if objectIDStr == "" {
		return nil
	}

	if objectIDStr == nil {
		return nil
	}

	objectID, err := primitive.ObjectIDFromHex(objectIDStr.(string))
	if err != nil {
		return nil
	}

	goUyeler := FikoYT.Koleksiyon("goUyeler")
	var kytUye FikoYTMap.FikoYTMap
	_ = goUyeler.FindOne(context.TODO(), fiber.Map{"_id": objectID}, &options.FindOneOptions{Projection: fiber.Map{"parola": 0, "epostaOnayKodu": 0, "anlasma": 0, "aktifDurum": 0}}).Decode(&kytUye)
	if kytUye == nil {
		return nil
	}

	///

	// if len(FikoYT.Cevap.Durum.Hatalar) > 0 {
	// 	FikoYT.Cevap.AyarlaDurumKodu(499)
	// 	FikoYT.Cevap.Durum.Hata = true

	// 	return nil
	// }

	///
	// FikoYT.Cevap.Sonuc = nil
	FikoYT.Cevap.AyarlaDurumKodu(200)

	FikoYT.Cevap.Sonuc = kytUye

	// fmt.Println(FikoYT.Sezon.Get("aktifKullaniciID").(string))

	return c.Status(200).JSON(kytUye)
}
func fikoyt_sistem_bilgi_guncelleme(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)
	///
	file, err := os.ReadFile("./sistem/kok/flutter_guncelleme.json") // updates.json dosyasını oku
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).SendString("Dosya okuma hatası")
	}

	var data FikoYTMap.FikoYTMap
	err = json.Unmarshal(file, &data) // JSON verisini struct'a çöz
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).SendString("JSON çözme hatası")
	}

	///
	FikoYT.Cevap.AyarlaDurumKodu(200)

	FikoYT.Cevap.Sonuc = data

	return c.Status(200).JSON(data)
}

func fikoyt_sistem_dosyalar_id_audio(c fiber.Ctx) error {
	objectIDStr := c.Params("id")

	if objectIDStr == "" {
		return fiber.ErrNotFound
	}

	objectID, err := primitive.ObjectIDFromHex(objectIDStr)
	if err != nil {
		return fiber.ErrNotFound
	}

	// GridFS'ten dosya oku
	fsName := "go_files"
	bucket, err := gridfs.NewBucket(
		fiko_mongo.GetMongoDBClient().Database("fikoyt"),
		&options.BucketOptions{Name: &fsName},
	)
	if err != nil {
		return fiber.ErrNotFound
	}

	stream, err := bucket.OpenDownloadStream(objectID)
	if err != nil {
		return fiber.ErrNotFound
	}
	defer stream.Close()

	// Content-Type (örnek: mp3)
	c.Set("Content-Type", "audio/mpeg")

	// Stream response’a yaz
	_, err = io.Copy(c, stream)
	if err != nil {
		return fiber.ErrInternalServerError
	}

	return nil
}
