package FikoYTDosya

/**/
// func compressWithFFmpeg(inputPath, outputPath string) (string, error) {
// 	mimeType, err := detectMimeType(inputPath)
// 	if err != nil {
// 		return "", fmt.Errorf("MIME türü tespit edilemedi: %v", err)
// 	}
// 	log.Printf("%s", mimeType)

// 	var cmd *exec.Cmd
// 	var ffmpegArgs []string
// 	// ffmpegPath := "./ffmpeg/ffmpeg.exe"
// 	// ffprobePath := "./ffmpeg/ffprobe.exe"
// 	ffmpegPath := "ffmpeg"
// 	ffprobePath := "ffprobe"
// 	if strings.HasPrefix(mimeType, "image") {
// 		ffmpegArgs = []string{
// 			"-i", inputPath, // Girdi dosyasını belirtir
// 			"-vcodec", "mjpeg", // MJPEG formatını kullanır (JPEG için uygun)
// 			"-q:v", "5", // Kaliteyi belirler (0 en iyi kalite, 31 en kötü kalite)
// 			"-vf", "scale='min(1920,iw)':'min(1080,ih)':force_original_aspect_ratio=decrease", // Çözünürlüğü orantılı şekilde sınırlar
// 			"-an",          // Ses çıkışı yok
// 			"-f", "image2", // Çıktı formatını belirtir (image2, resim için)
// 			"-hide_banner",       // Banner bilgisini gizler
// 			"-nostats",           // İstatistik bilgilerini gizler
// 			"-loglevel", "quiet", // Log seviyesini sessiz yapar
// 			outputPath, // Çıktı dosya yolu
// 		}
// 		// ffmpegArgs = []string{
// 		// 	"-i", inputPath,
// 		// 	"-vcodec", "libwebp",
// 		// 	"-lossless", "0",
// 		// 	"-q:v", "75",
// 		// 	"-an",
// 		// 	"-fps_mode", "auto",
// 		// 	"-f", "webp",
// 		// 	"-hide_banner",
// 		// 	"-nostats",
// 		// 	"-loglevel", "quiet",
// 		// 	outputPath,
// 		// }
// 	} else if strings.HasPrefix(mimeType, "video") {
// 		ffmpegArgs = []string{
// 			"-i", inputPath,
// 			"-c:v", "h264_nvenc", // NVENC kullan
// 			"-preset", "p3", // Daha hızlı kodlama (kalitede biraz düşüş)
// 			"-rc", "vbr_hq", // Kaliteli değişken bit hızı
// 			"-cq", "30", // Daha yüksek CQ, daha küçük boyut (kalitede biraz düşüş)
// 			"-b:v", "0", // CQ ile birlikte kullanılır
// 			"-maxrate", "3000k", // Maksimum bit hızı düşürüldü
// 			"-bufsize", "6000k", // Tampon boyutu düşürüldü
// 			"-profile:v", "high",
// 			"-level:v", "4.1",
// 			"-vf", "scale=w=854:h=480:force_original_aspect_ratio=decrease", // Çözünürlük düşürüldü (480p)
// 			"-c:a", "aac", // AAC ses
// 			"-b:a", "64k", // Ses bit hızı düşürüldü
// 			"-f", "mp4", // MP4 çıktı
// 			"-hide_banner",       // Banner gizle
// 			"-nostats",           // İstatistikleri gizle
// 			"-loglevel", "debug", // Hata ayıklama seviyesi
// 			outputPath,
// 		}
// 		// // Düşük Kalite
// 		// ffmpegArgs = []string{
// 		// 	"-i", inputPath,
// 		// 	"-c:v", "h264_nvenc",
// 		// 	"-preset", "ultrafast", // En hızlı ön ayar
// 		// 	"-rc", "vbr_hq", // Kaliteli değişken bit hızı
// 		// 	"-cq", "35", // En yüksek CQ (en küçük boyut)
// 		// 	"-b:v", "0", // CQ ile birlikte kullanılır
// 		// 	"-maxrate", "1000k", // Maksimum bit hızı çok düşürüldü
// 		// 	"-bufsize", "2000k", // Tampon boyutu çok düşürüldü
// 		// 	"-profile:v", "baseline", // Profil düşürüldü
// 		// 	"-level:v", "3.1", // Level düşürüldü
// 		// 	"-vf", "scale=w=640:h=360:force_original_aspect_ratio=decrease", // Çözünürlük çok düşürüldü (360p)
// 		// 	"-c:a", "aac", // AAC ses
// 		// 	"-b:a", "32k", // Ses bit hızı çok düşürüldü
// 		// 	"-f", "mp4", // MP4 çıktı
// 		// 	"-hide_banner",
// 		// 	"-nostats",
// 		// 	"-loglevel", "debug",
// 		// 	outputPath,
// 		// }

// 	} else if strings.HasPrefix(mimeType, "audio") {
// 		ffmpegArgs = []string{
// 			"-i", inputPath,
// 			"-vn",
// 			"-ar", "44100",
// 			"-ac", "2",
// 			"-b:a", "96k",
// 			"-threads", "8",
// 			"-hide_banner",
// 			"-nostats",
// 			"-loglevel", "quiet",
// 			outputPath,
// 		}
// 	} else if strings.HasPrefix(mimeType, "application/octet-stream") {
// 		ffmpegArgs = []string{
// 			"-i", inputPath,
// 			"-c:v", "h264_nvenc", // NVENC kullan
// 			"-preset", "p3", // Daha hızlı kodlama (kalitede biraz düşüş)
// 			"-rc", "vbr_hq", // Kaliteli değişken bit hızı
// 			"-cq", "30", // Daha yüksek CQ, daha küçük boyut (kalitede biraz düşüş)
// 			"-b:v", "0", // CQ ile birlikte kullanılır
// 			"-maxrate", "3000k", // Maksimum bit hızı düşürüldü
// 			"-bufsize", "6000k", // Tampon boyutu düşürüldü
// 			"-profile:v", "high",
// 			"-level:v", "4.1",
// 			"-vf", "scale=w=854:h=480:force_original_aspect_ratio=decrease", // Çözünürlük düşürüldü (480p)
// 			"-c:a", "aac", // AAC ses
// 			"-b:a", "64k", // Ses bit hızı düşürüldü
// 			"-f", "mp4", // MP4 çıktı
// 			"-hide_banner",       // Banner gizle
// 			"-nostats",           // İstatistikleri gizle
// 			"-loglevel", "debug", // Hata ayıklama seviyesi
// 			outputPath,
// 		}
// 	} else {
// 		return "", fmt.Errorf("desteklenmeyen MIME türü: %s", mimeType)
// 	}

// 	ffmpegArgs = append(ffmpegArgs, "-progress", "pipe:1")

// 	cmd = exec.Command(ffmpegPath, ffmpegArgs...)

// 	var stderrBuf bytes.Buffer
// 	cmd.Stderr = &stderrBuf

// 	stdoutPipe, err := cmd.StdoutPipe()
// 	if err != nil {
// 		return "", fmt.Errorf("StdoutPipe oluşturulamadı: %v", err)
// 	}

// 	if err := cmd.Start(); err != nil {
// 		return "", fmt.Errorf("FFmpeg başlatılamadı: %v - %s", err, stderrBuf.String())
// 	}

// 	duration, err := getDuration(inputPath, ffprobePath)
// 	if err != nil {
// 		// fmt.Println("Uyarı: Süre alınamadı, ilerleme tahmini yapılamayacak:", err)
// 	}

// 	go func() {
// 		scanner := bufio.NewScanner(stdoutPipe)
// 		reTime := regexp.MustCompile(`time=(\d+:\d+:\d+\.\d+)`)
// 		reProgressEnd := regexp.MustCompile(`progress=end\.(\d+)%`)
// 		for scanner.Scan() {
// 			line := scanner.Text()

// 			matchProgressEnd := reProgressEnd.FindStringSubmatch(line)
// 			if len(matchProgressEnd) > 1 {
// 				percentage, _ := strconv.Atoi(matchProgressEnd[1])
// 				fmt.Printf("İlerleme: %d%%\n", percentage)
// 				break
// 			} else {
// 				matchTime := reTime.FindStringSubmatch(line)
// 				if len(matchTime) > 1 && duration > 0 {
// 					currentTime, err := parseTime(matchTime[1])
// 					if err == nil {
// 						percentage := int(float64(currentTime) / float64(duration) * 100)
// 						fmt.Printf("İlerleme: %d%%\r", percentage)
// 					}
// 				}
// 			}
// 		}
// 		if err := scanner.Err(); err != nil {
// 			fmt.Fprintln(os.Stderr, "Error reading FFmpeg stdout:", err)
// 		}
// 	}()

// 	go func() {
// 		scanner := bufio.NewScanner(&stderrBuf)
// 		for scanner.Scan() {
// 			// fmt.Fprintln(os.Stderr, "[FFmpeg Error/Warning] "+scanner.Text())
// 		}
// 		if err := scanner.Err(); err != nil {
// 			fmt.Fprintln(os.Stderr, "Error reading FFmpeg stderr:", err)
// 		}
// 	}()

// 	if err := cmd.Wait(); err != nil {
// 		return "", fmt.Errorf("FFmpeg işlem hatası: %v - %s", err, stderrBuf.String())
// 	}

// 	return mimeType, nil
// }

// func getDuration(path, ffprobePath string) (float64, error) {
// 	cmd := exec.Command(ffprobePath, "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", path)
// 	output, err := cmd.Output()
// 	if err != nil {
// 		return 0, err
// 	}
// 	durationStr := strings.TrimSpace(string(output))
// 	duration, err := strconv.ParseFloat(durationStr, 64)
// 	if err != nil {
// 		return 0, err
// 	}
// 	return duration, nil
// }

// func parseTime(timeStr string) (float64, error) {
// 	parts := strings.Split(timeStr, ":")
// 	if len(parts) != 3 {
// 		return 0, fmt.Errorf("geçersiz zaman formatı")
// 	}
// 	hours, err := strconv.Atoi(parts[0])
// 	if err != nil {
// 		return 0, err
// 	}
// 	minutes, err := strconv.Atoi(parts[1])
// 	if err != nil {
// 		return 0, err
// 	}
// 	secondsStr := strings.Replace(parts[2], ",", ".", 1)
// 	seconds, err := strconv.ParseFloat(secondsStr, 64)
// 	if err != nil {
// 		return 0, err
// 	}
// 	return float64(hours*3600+minutes*60) + seconds, nil
// }

/**/

/**/

// Komut çalıştırma ve çıktıyı okuma
// func executeCommand(cmd *exec.Cmd) error {
// 	stdout, err := cmd.StdoutPipe()
// 	if err != nil {
// 		return fmt.Errorf("Error creating stdout pipe: %v", err)
// 	}

// 	cmd.Stderr = os.Stderr

// 	if err := cmd.Start(); err != nil {
// 		return fmt.Errorf("Error starting command: %v", err)
// 	}

// 	scanner := bufio.NewScanner(stdout)
// 	for scanner.Scan() {
// 		line := scanner.Text()
// 		if line != "" {
// 			fmt.Println(line) // Terminale ilerleme bilgisi yaz
// 		}
// 	}

// 	if err := scanner.Err(); err != nil {
// 		return fmt.Errorf("Error reading command output: %v", err)
// 	}

// 	return cmd.Wait()
// }

// İşlenen dosyayı GridFS'ye kaydetme
// func saveToGridFS(fileID primitive.ObjectID, filePath string, metaData *fiber.Map) (primitive.ObjectID, error) {
// 	db := fiko_mongo.GetMongoDBClient().Database("fikoyt")
// 	fsName := "go_files"
// 	bucket, err := gridfs.NewBucket(db, &options.BucketOptions{Name: &fsName})
// 	if err != nil {
// 		return primitive.NilObjectID, fiber.NewError(fiber.StatusInternalServerError, "GridFS Bucket oluşturulamadı: "+err.Error())
// 	}

// 	file, err := os.Open(filePath)
// 	if err != nil {
// 		return primitive.NilObjectID, fmt.Errorf("dosya açılamadı: %v", err)
// 	}
// 	defer file.Close()

// 	uploadStream, err := bucket.OpenUploadStreamWithID(fileID, strings.ReplaceAll(filepath.Base(filePath), "-processed", ""), &options.UploadOptions{Metadata: metaData})
// 	if err != nil {
// 		return primitive.NilObjectID, fmt.Errorf("upload stream oluşturulamadı: %v", err)
// 	}
// 	defer uploadStream.Close()

// 	if _, err := io.Copy(uploadStream, file); err != nil {
// 		return primitive.NilObjectID, fmt.Errorf("dosya GridFS'ye yazılamadı: %v", err)
// 	}

// 	return fileID, nil
// }

// func DeleteFromGridfs(fileID primitive.ObjectID) error {
// 	db := fiko_mongo.GetMongoDBClient().Database("fikoyt")
// 	fsName := "go_files"
// 	bucket, err := gridfs.NewBucket(db, &options.BucketOptions{Name: &fsName})
// 	if err != nil {
// 		return fiber.NewError(fiber.StatusInternalServerError, "GridFS Bucket oluşturulamadı: "+err.Error())
// 	}

// 	return bucket.Delete(fileID)
// }
