package FikoYTDosya

import (
	"fmt"
	"strings"

	"github.com/gofiber/fiber/v3"
	"go.mongodb.org/mongo-driver/bson/primitive"
)

// AraIsleyici: Dosyayı alıp FileInfo sınıfına ileten middleware
func AraIsleyici() fiber.Handler {
	return func(c fiber.Ctx) error {
		// Multipart form bilgilerini al
		form, err := c.MultipartForm()
		if err != nil {

			return c.Next()
		}

		var processedFiles []FikoYTDosya

		for _, files := range form.File {
			for _, fileHeader := range files {
				contentDisposition := fileHeader.Header.Get("Content-Disposition")
				fmt.Println("Raw Content-Disposition:", contentDisposition)

				// name ve filename ayrıştırmak için:
				dispositionParts := parseContentDisposition(contentDisposition)
				fmt.Println("Parsed name:", dispositionParts["name"])
				fmt.Println("Parsed filename:", dispositionParts["filename"])

				id, _ := primitive.ObjectIDFromHex(dispositionParts["name"])

				// FileInfo objesi oluştur
				fileInfo := &FikoYTDosya{
					Id:            id,
					File:          fileHeader,
					Path:          fileHeader.Filename, // Örnek dosya yolu
					ProcessedPath: "",                  // Örnek dosya yolu
					Saved:         false,
					Processed:     false,
				}
				processedFiles = append(processedFiles, *fileInfo)
			}
		}
		// fmt.Println(processedFiles)
		// FileInfo objesini context'e ilet
		c.Locals("files", processedFiles)
		// Ana handler'a yönlendir
		return c.Next()

	}

}

func parseContentDisposition(header string) map[string]string {
	result := make(map[string]string)
	parts := strings.Split(header, ";")
	for _, part := range parts {
		part = strings.TrimSpace(part)
		if strings.Contains(part, "=") {
			kv := strings.SplitN(part, "=", 2)
			key := strings.ToLower(kv[0])
			value := strings.Trim(kv[1], `"`)
			result[key] = value
		}
	}
	return result
}
