package freecad

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"mime/multipart"
	"net/http"
	"os"
	"path/filepath"
	"time"

	FikoYTCtx "server/sistem/fikoyt_ctx"

	"github.com/gofiber/fiber/v3"
	"github.com/gofiber/fiber/v3/middleware/cors"
)

// FreeCAD Python API URL
var freecadAPIURL = os.Getenv("FREECAD_API_URL")

func init() {
	if freecadAPIURL == "" {
		freecadAPIURL = "http://localhost:8090" // Varsayılan
	}
}

// FreeCAD API Response yapıları
type FreecadAnalysisResponse struct {
	Success        bool                   `json:"success"`
	FileID         string                 `json:"file_id,omitempty"` // YENİ: Cache için file ID
	Data           map[string]interface{} `json:"data,omitempty"`
	CacheExpiresIn int                    `json:"cache_expires_in,omitempty"` // YENİ: Cache süresi
	Message        string                 `json:"message"`
	Error          string                 `json:"error,omitempty"`
	Traceback      string                 `json:"traceback,omitempty"`
}

type MaterialListResponse struct {
	Success   bool                     `json:"success"`
	Materials []map[string]interface{} `json:"materials,omitempty"`
}

// Init - FreeCAD API router'ı başlat
func Init(app *fiber.App, api fiber.Router) {
	freecad := api.Group("/freecad")

	// STEP dosya analizi
	freecad.Post("/analyze", analyzeStepFile)

	// Malzeme listesi
	freecad.Get("/materials", listMaterials)

	// Health check
	freecad.Get("/health", healthCheck)

	// STEP dosya render (GIF) - RAW endpoint, CORS enabled
	rawGroup := app.Group("/uyar/api-raw/freecad")
	rawGroup.Use(cors.New(cors.Config{
		AllowOrigins:     []string{"*"},
		AllowMethods:     []string{"POST", "OPTIONS"},
		AllowHeaders:     []string{"*"},
		AllowCredentials: false,
	}))
	rawGroup.Post("/render", renderStepFileRaw)
	rawGroup.Post("/render-cached", renderCachedFileRaw) // YENİ: Cache'den render
}

// analyzeStepFile - STEP dosyasını FreeCAD ile analiz et
func analyzeStepFile(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	// Response başlat
	FikoYT.Cevap.AyarlaDurumKodu(200)
	FikoYT.Cevap.Durum.Tamamlandi = false
	FikoYT.Cevap.Durum.Hata = false

	// Dosya kontrolü
	file, err := c.FormFile("file")
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(400)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "STEP dosyası bulunamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": "No file uploaded",
		}
		return c.JSON(FikoYT.Cevap)
	}

	// Dosya uzantısı kontrolü
	ext := filepath.Ext(file.Filename)
	if ext != ".stp" && ext != ".step" && ext != ".STP" && ext != ".STEP" {
		FikoYT.Cevap.AyarlaDurumKodu(400)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "Sadece .stp veya .step dosyaları kabul edilir"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": "Invalid file type",
		}
		return c.JSON(FikoYT.Cevap)
	}

	// Parametreleri al
	material := c.FormValue("material", "aluminium")
	density := c.FormValue("density", "")
	precision := c.FormValue("precision", "")

	// Dosyayı aç
	fileReader, err := file.Open()
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "Dosya açılamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": err.Error(),
		}
		return c.JSON(FikoYT.Cevap)
	}
	defer fileReader.Close()

	// Multipart form oluştur
	var requestBody bytes.Buffer
	writer := multipart.NewWriter(&requestBody)

	// Dosya ekle
	part, err := writer.CreateFormFile("file", file.Filename)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "Multipart form oluşturulamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": err.Error(),
		}
		return c.JSON(FikoYT.Cevap)
	}

	_, err = io.Copy(part, fileReader)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "Dosya kopyalanamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": err.Error(),
		}
		return c.JSON(FikoYT.Cevap)
	}

	// Parametreleri ekle
	if material != "" {
		writer.WriteField("material", material)
	}
	if density != "" {
		writer.WriteField("density", density)
	}
	if precision != "" {
		writer.WriteField("precision", precision)
	}

	writer.Close()

	// Python API'ye istek gönder
	apiURL := fmt.Sprintf("%s/analyze", freecadAPIURL)
	req, err := http.NewRequest("POST", apiURL, &requestBody)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "API isteği oluşturulamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": err.Error(),
		}
		return c.JSON(FikoYT.Cevap)
	}

	req.Header.Set("Content-Type", writer.FormDataContentType())

	// HTTP client (timeout ile)
	client := &http.Client{
		Timeout: 120 * time.Second, // 2 dakika timeout
	}

	resp, err := client.Do(req)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "FreeCAD API'ye bağlanılamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error":   err.Error(),
			"api_url": apiURL,
		}
		return c.JSON(FikoYT.Cevap)
	}
	defer resp.Body.Close()

	// Response oku
	responseBody, err := io.ReadAll(resp.Body)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "API response okunamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": err.Error(),
		}
		return c.JSON(FikoYT.Cevap)
	}

	// JSON parse
	var freecadResponse FreecadAnalysisResponse
	err = json.Unmarshal(responseBody, &freecadResponse)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "API response parse edilemedi"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error":    err.Error(),
			"response": string(responseBody),
		}
		return c.JSON(FikoYT.Cevap)
	}

	// FreeCAD API başarılı mı?
	if !freecadResponse.Success {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = freecadResponse.Message
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error":     freecadResponse.Error,
			"message":   freecadResponse.Message,
			"traceback": freecadResponse.Traceback,
		}
		return c.JSON(FikoYT.Cevap)
	}

	// Başarılı response (file_id ekle!)
	FikoYT.Cevap.AyarlaDurumKodu(200)
	FikoYT.Cevap.Durum.Tamamlandi = true
	FikoYT.Cevap.Durum.Mesaj = "STEP dosyası başarıyla analiz edildi"

	// YENİ: file_id'yi sonuca ekle
	result := freecadResponse.Data
	if freecadResponse.FileID != "" {
		result["file_id"] = freecadResponse.FileID
		result["cache_expires_in"] = freecadResponse.CacheExpiresIn
	}

	FikoYT.Cevap.Sonuc = result

	return c.JSON(FikoYT.Cevap)
}

// listMaterials - Mevcut malzeme listesini döndür
func listMaterials(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	// Response başlat
	FikoYT.Cevap.AyarlaDurumKodu(200)
	FikoYT.Cevap.Durum.Tamamlandi = false
	FikoYT.Cevap.Durum.Hata = false

	// Python API'ye istek gönder
	apiURL := fmt.Sprintf("%s/materials", freecadAPIURL)
	resp, err := http.Get(apiURL)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "FreeCAD API'ye bağlanılamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": err.Error(),
		}
		return c.JSON(FikoYT.Cevap)
	}
	defer resp.Body.Close()

	// Response oku
	responseBody, err := io.ReadAll(resp.Body)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "API response okunamadı"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": err.Error(),
		}
		return c.JSON(FikoYT.Cevap)
	}

	// JSON parse
	var materialResponse MaterialListResponse
	err = json.Unmarshal(responseBody, &materialResponse)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "API response parse edilemedi"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"error": err.Error(),
		}
		return c.JSON(FikoYT.Cevap)
	}

	// Başarılı response
	FikoYT.Cevap.AyarlaDurumKodu(200)
	FikoYT.Cevap.Durum.Tamamlandi = true
	FikoYT.Cevap.Durum.Mesaj = "Malzeme listesi başarıyla alındı"
	FikoYT.Cevap.Sonuc = map[string]interface{}{
		"materials": materialResponse.Materials,
	}

	return c.JSON(FikoYT.Cevap)
}

// healthCheck - FreeCAD API'nin sağlık kontrolü
func healthCheck(c fiber.Ctx) error {
	FikoYT := c.Locals("FikoYTCtx").(*FikoYTCtx.FikoYTCtx)

	// Response başlat
	FikoYT.Cevap.AyarlaDurumKodu(200)
	FikoYT.Cevap.Durum.Tamamlandi = false
	FikoYT.Cevap.Durum.Hata = false

	// Python API'ye istek gönder
	apiURL := fmt.Sprintf("%s/health", freecadAPIURL)
	resp, err := http.Get(apiURL)
	if err != nil {
		FikoYT.Cevap.AyarlaDurumKodu(500)
		FikoYT.Cevap.Durum.Hata = true
		FikoYT.Cevap.Durum.Mesaj = "FreeCAD API çalışmıyor"
		FikoYT.Cevap.Sonuc = map[string]interface{}{
			"status":  "down",
			"error":   err.Error(),
			"api_url": apiURL,
		}
		return c.JSON(FikoYT.Cevap)
	}
	defer resp.Body.Close()

	// Response oku
	var healthResponse map[string]interface{}
	json.NewDecoder(resp.Body).Decode(&healthResponse)

	// Başarılı response
	FikoYT.Cevap.AyarlaDurumKodu(200)
	FikoYT.Cevap.Durum.Tamamlandi = true
	FikoYT.Cevap.Durum.Mesaj = "FreeCAD API çalışıyor"
	FikoYT.Cevap.Sonuc = healthResponse

	return c.JSON(FikoYT.Cevap)
}

// renderStepFileRaw - STEP dosyasından GIF render oluştur (RAW endpoint)
func renderStepFileRaw(c fiber.Ctx) error {
	fmt.Println("[RENDER] Request received")

	// Binary response - no middleware
	c.Set("Content-Type", "image/gif")

	// Dosya kontrolü
	file, err := c.FormFile("file")
	if err != nil {
		fmt.Printf("[RENDER ERROR] FormFile error: %v\n", err)
		return c.Status(400).JSON(fiber.Map{
			"success": false,
			"error":   "No file uploaded",
			"message": "STEP dosyası bulunamadı",
		})
	}

	fmt.Printf("[RENDER] File received: %s\n", file.Filename)

	// Dosya uzantısı kontrolü
	ext := filepath.Ext(file.Filename)
	if ext != ".stp" && ext != ".step" && ext != ".STP" && ext != ".STEP" {
		return c.Status(400).JSON(fiber.Map{
			"success": false,
			"error":   "Invalid file type",
			"message": "Sadece .stp veya .step dosyaları kabul edilir",
		})
	}

	// Dosyayı aç
	fileReader, err := file.Open()
	if err != nil {
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "Dosya açılamadı",
		})
	}
	defer fileReader.Close()

	// Multipart form oluştur
	var requestBody bytes.Buffer
	writer := multipart.NewWriter(&requestBody)

	// Dosya ekle
	part, err := writer.CreateFormFile("file", file.Filename)
	if err != nil {
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "Multipart form oluşturulamadı",
		})
	}

	_, err = io.Copy(part, fileReader)
	if err != nil {
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "Dosya kopyalanamadı",
		})
	}

	// Render parametrelerini ekle
	// Görüntü boyutları
	if width := c.FormValue("width"); width != "" {
		writer.WriteField("width", width)
	}
	if height := c.FormValue("height"); height != "" {
		writer.WriteField("height", height)
	}

	// Kamera ayarları
	if zoom := c.FormValue("zoom"); zoom != "" {
		writer.WriteField("zoom", zoom)
	}
	if viewType := c.FormValue("view_type"); viewType != "" {
		writer.WriteField("view_type", viewType)
	}
	if bgColor := c.FormValue("background_color"); bgColor != "" {
		writer.WriteField("background_color", bgColor)
	}

	// Animasyon ayarları
	if rotationSpeed := c.FormValue("rotation_speed"); rotationSpeed != "" {
		writer.WriteField("rotation_speed", rotationSpeed)
	}
	if numFrames := c.FormValue("num_frames"); numFrames != "" {
		writer.WriteField("num_frames", numFrames)
	}
	if fps := c.FormValue("fps"); fps != "" {
		writer.WriteField("fps", fps)
	}

	// Rotasyon eksenleri
	if yawEnabled := c.FormValue("yaw_enabled"); yawEnabled != "" {
		writer.WriteField("yaw_enabled", yawEnabled)
	}
	if pitchEnabled := c.FormValue("pitch_enabled"); pitchEnabled != "" {
		writer.WriteField("pitch_enabled", pitchEnabled)
	}
	if rollEnabled := c.FormValue("roll_enabled"); rollEnabled != "" {
		writer.WriteField("roll_enabled", rollEnabled)
	}

	// Rotasyon açı aralıkları
	if yawRange := c.FormValue("yaw_range"); yawRange != "" {
		writer.WriteField("yaw_range", yawRange)
	}
	if pitchRange := c.FormValue("pitch_range"); pitchRange != "" {
		writer.WriteField("pitch_range", pitchRange)
	}
	if rollRange := c.FormValue("roll_range"); rollRange != "" {
		writer.WriteField("roll_range", rollRange)
	}

	// GIF ayarları
	if gifOptimize := c.FormValue("gif_optimize"); gifOptimize != "" {
		writer.WriteField("gif_optimize", gifOptimize)
	}
	if gifQuality := c.FormValue("gif_quality"); gifQuality != "" {
		writer.WriteField("gif_quality", gifQuality)
	}
	if pauseDuration := c.FormValue("pause_duration"); pauseDuration != "" {
		writer.WriteField("pause_duration", pauseDuration)
	}
	if loop := c.FormValue("loop"); loop != "" {
		writer.WriteField("loop", loop)
	}

	// ====== YENİ: Profesyonel Render Araçları ======

	// Render kalitesi
	if quality := c.FormValue("render_quality"); quality != "" {
		writer.WriteField("render_quality", quality)
	}
	if antiAliasing := c.FormValue("anti_aliasing"); antiAliasing != "" {
		writer.WriteField("anti_aliasing", antiAliasing)
	}

	// Filtreler
	if edgeDetection := c.FormValue("edge_detection"); edgeDetection != "" {
		writer.WriteField("edge_detection", edgeDetection)
	}
	if sharpen := c.FormValue("sharpen"); sharpen != "" {
		writer.WriteField("sharpen", sharpen)
	}
	if sharpenIntensity := c.FormValue("sharpen_intensity"); sharpenIntensity != "" {
		writer.WriteField("sharpen_intensity", sharpenIntensity)
	}
	if smooth := c.FormValue("smooth"); smooth != "" {
		writer.WriteField("smooth", smooth)
	}
	if smoothRadius := c.FormValue("smooth_radius"); smoothRadius != "" {
		writer.WriteField("smooth_radius", smoothRadius)
	}

	// Renk ayarları
	if contrast := c.FormValue("contrast"); contrast != "" {
		writer.WriteField("contrast", contrast)
	}
	if brightness := c.FormValue("brightness"); brightness != "" {
		writer.WriteField("brightness", brightness)
	}
	if saturation := c.FormValue("saturation"); saturation != "" {
		writer.WriteField("saturation", saturation)
	}

	// Efektler
	if ambientOcclusion := c.FormValue("ambient_occlusion"); ambientOcclusion != "" {
		writer.WriteField("ambient_occlusion", ambientOcclusion)
	}
	if aoIntensity := c.FormValue("ao_intensity"); aoIntensity != "" {
		writer.WriteField("ao_intensity", aoIntensity)
	}
	if shadow := c.FormValue("shadow"); shadow != "" {
		writer.WriteField("shadow", shadow)
	}
	if shadowOffsetX := c.FormValue("shadow_offset_x"); shadowOffsetX != "" {
		writer.WriteField("shadow_offset_x", shadowOffsetX)
	}
	if shadowOffsetY := c.FormValue("shadow_offset_y"); shadowOffsetY != "" {
		writer.WriteField("shadow_offset_y", shadowOffsetY)
	}
	if shadowBlur := c.FormValue("shadow_blur"); shadowBlur != "" {
		writer.WriteField("shadow_blur", shadowBlur)
	}
	if shadowOpacity := c.FormValue("shadow_opacity"); shadowOpacity != "" {
		writer.WriteField("shadow_opacity", shadowOpacity)
	}
	if vignette := c.FormValue("vignette"); vignette != "" {
		writer.WriteField("vignette", vignette)
	}
	if vignetteIntensity := c.FormValue("vignette_intensity"); vignetteIntensity != "" {
		writer.WriteField("vignette_intensity", vignetteIntensity)
	}
	if wireframe := c.FormValue("wireframe"); wireframe != "" {
		writer.WriteField("wireframe", wireframe)
	}
	if wireframeDensity := c.FormValue("wireframe_density"); wireframeDensity != "" {
		writer.WriteField("wireframe_density", wireframeDensity)
	}

	// Işıklandırma
	if lightingEnabled := c.FormValue("lighting_enabled"); lightingEnabled != "" {
		writer.WriteField("lighting_enabled", lightingEnabled)
	}
	if lightIntensity := c.FormValue("light_intensity"); lightIntensity != "" {
		writer.WriteField("light_intensity", lightIntensity)
	}
	if lightColorR := c.FormValue("light_color_r"); lightColorR != "" {
		writer.WriteField("light_color_r", lightColorR)
	}
	if lightColorG := c.FormValue("light_color_g"); lightColorG != "" {
		writer.WriteField("light_color_g", lightColorG)
	}
	if lightColorB := c.FormValue("light_color_b"); lightColorB != "" {
		writer.WriteField("light_color_b", lightColorB)
	}

	// Malzeme özellikleri
	if materialMetallic := c.FormValue("material_metallic"); materialMetallic != "" {
		writer.WriteField("material_metallic", materialMetallic)
	}
	if materialRoughness := c.FormValue("material_roughness"); materialRoughness != "" {
		writer.WriteField("material_roughness", materialRoughness)
	}

	// Arka plan efektleri
	if gradientBackground := c.FormValue("gradient_background"); gradientBackground != "" {
		writer.WriteField("gradient_background", gradientBackground)
	}
	if gradientColor1 := c.FormValue("gradient_color_1"); gradientColor1 != "" {
		writer.WriteField("gradient_color_1", gradientColor1)
	}
	if gradientColor2 := c.FormValue("gradient_color_2"); gradientColor2 != "" {
		writer.WriteField("gradient_color_2", gradientColor2)
	}

	// ====== YENİ: Gelişmiş Profesyonel Efektler ======

	// Depth of Field
	if depthOfField := c.FormValue("depth_of_field"); depthOfField != "" {
		writer.WriteField("depth_of_field", depthOfField)
	}
	if dofFocusDistance := c.FormValue("dof_focus_distance"); dofFocusDistance != "" {
		writer.WriteField("dof_focus_distance", dofFocusDistance)
	}
	if dofAperture := c.FormValue("dof_aperture"); dofAperture != "" {
		writer.WriteField("dof_aperture", dofAperture)
	}

	// Bloom
	if bloom := c.FormValue("bloom"); bloom != "" {
		writer.WriteField("bloom", bloom)
	}
	if bloomIntensity := c.FormValue("bloom_intensity"); bloomIntensity != "" {
		writer.WriteField("bloom_intensity", bloomIntensity)
	}
	if bloomThreshold := c.FormValue("bloom_threshold"); bloomThreshold != "" {
		writer.WriteField("bloom_threshold", bloomThreshold)
	}

	// Motion Blur
	if motionBlur := c.FormValue("motion_blur"); motionBlur != "" {
		writer.WriteField("motion_blur", motionBlur)
	}
	if motionBlurIntensity := c.FormValue("motion_blur_intensity"); motionBlurIntensity != "" {
		writer.WriteField("motion_blur_intensity", motionBlurIntensity)
	}

	// Grid/Cetvel
	if gridOverlay := c.FormValue("grid_overlay"); gridOverlay != "" {
		writer.WriteField("grid_overlay", gridOverlay)
	}
	if gridSize := c.FormValue("grid_size"); gridSize != "" {
		writer.WriteField("grid_size", gridSize)
	}
	if rulerEnabled := c.FormValue("ruler_enabled"); rulerEnabled != "" {
		writer.WriteField("ruler_enabled", rulerEnabled)
	}

	// Yansıma ve Normal Map
	if reflectionIntensity := c.FormValue("reflection_intensity"); reflectionIntensity != "" {
		writer.WriteField("reflection_intensity", reflectionIntensity)
	}
	if normalMapIntensity := c.FormValue("normal_map_intensity"); normalMapIntensity != "" {
		writer.WriteField("normal_map_intensity", normalMapIntensity)
	}

	// Ortam Efektleri (Fog)
	if fog := c.FormValue("fog"); fog != "" {
		writer.WriteField("fog", fog)
	}
	if fogDensity := c.FormValue("fog_density"); fogDensity != "" {
		writer.WriteField("fog_density", fogDensity)
	}
	if fogColor := c.FormValue("fog_color"); fogColor != "" {
		writer.WriteField("fog_color", fogColor)
	}

	writer.Close()

	// Python API'ye istek gönder
	apiURL := fmt.Sprintf("%s/render", freecadAPIURL)
	req, err := http.NewRequest("POST", apiURL, &requestBody)
	if err != nil {
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "API isteği oluşturulamadı",
		})
	}

	req.Header.Set("Content-Type", writer.FormDataContentType())

	// HTTP client (uzun timeout)
	client := &http.Client{
		Timeout: 300 * time.Second, // 5 dakika timeout (render uzun sürebilir)
	}

	resp, err := client.Do(req)
	if err != nil {
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "FreeCAD API'ye bağlanılamadı",
		})
	}
	defer resp.Body.Close()

	// Hata kontrolü
	if resp.StatusCode != 200 {
		fmt.Printf("[RENDER ERROR] Python API error: %d\n", resp.StatusCode)
		responseBody, _ := io.ReadAll(resp.Body)
		return c.Status(resp.StatusCode).JSON(fiber.Map{
			"success": false,
			"error":   string(responseBody),
			"message": "Render hatası",
		})
	}

	fmt.Println("[RENDER] Python API response 200, reading GIF...")

	// GIF'i memory'ye al
	gifData, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("[RENDER ERROR] ReadAll error: %v\n", err)
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "GIF okunamadı",
		})
	}

	fmt.Printf("[RENDER] GIF read successfully (%d bytes)\n", len(gifData))

	// GIF'i döndür
	c.Set("Content-Type", "image/gif")
	c.Set("Content-Length", fmt.Sprintf("%d", len(gifData)))
	c.Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s.gif\"",
		file.Filename[:len(file.Filename)-len(ext)]))

	fmt.Println("[RENDER] Sending GIF to client...")
	return c.Send(gifData)
}

// renderCachedFileRaw - Cache'lenmiş dosyadan GIF render (DOSYA TEKRAR YÜKLENMİYOR!)
func renderCachedFileRaw(c fiber.Ctx) error {
	fmt.Println("[RENDER-CACHED] Request received")
	fmt.Printf("[RENDER-CACHED] Content-Type: %s\n", c.Get("Content-Type"))
	fmt.Printf("[RENDER-CACHED] All form values: %v\n", c.Request().URI().QueryArgs())

	// Binary response - no middleware
	c.Set("Content-Type", "image/gif")

	// Multipart form parse et
	form, err := c.MultipartForm()
	if err != nil {
		fmt.Printf("[RENDER-CACHED ERROR] MultipartForm parse error: %v\n", err)
		return c.Status(400).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "Form parse edilemedi",
		})
	}

	fmt.Printf("[RENDER-CACHED DEBUG] Form values: %v\n", form.Value)

	// file_id kontrolü (ZORUNLU!)
	fileID := ""
	if vals, ok := form.Value["file_id"]; ok && len(vals) > 0 {
		fileID = vals[0]
	}

	fmt.Printf("[RENDER-CACHED] file_id: '%s'\n", fileID)

	if fileID == "" {
		fmt.Println("[RENDER-CACHED ERROR] file_id parameter missing")
		return c.Status(400).JSON(fiber.Map{
			"success": false,
			"error":   "file_id parameter required",
			"message": "file_id parametresi gerekli",
		})
	}

	fmt.Printf("[RENDER-CACHED] file_id OK: %s\n", fileID)

	// Helper function: multipart form'dan value al
	getFormValue := func(key string) string {
		if vals, ok := form.Value[key]; ok && len(vals) > 0 {
			return vals[0]
		}
		return ""
	}

	// Multipart form oluştur (dosya YOK, sadece parametreler!)
	var requestBody bytes.Buffer
	writer := multipart.NewWriter(&requestBody)

	// file_id ekle
	writer.WriteField("file_id", fileID)

	object_name := ""
	if vals, ok := form.Value["object_name"]; ok && len(vals) > 0 {
		object_name = vals[0]
	}

	writer.WriteField("object_name", object_name)

	// Tüm render parametrelerini ekle (renderStepFileRaw ile aynı)
	// Görüntü boyutları
	if width := getFormValue("width"); width != "" {
		writer.WriteField("width", width)
	}
	if height := getFormValue("height"); height != "" {
		writer.WriteField("height", height)
	}

	// Kamera ayarları
	if zoom := getFormValue("zoom"); zoom != "" {
		writer.WriteField("zoom", zoom)
	}
	if viewType := getFormValue("view_type"); viewType != "" {
		writer.WriteField("view_type", viewType)
	}
	if bgColor := getFormValue("background_color"); bgColor != "" {
		writer.WriteField("background_color", bgColor)
	}

	// Animasyon ayarları
	if rotationSpeed := getFormValue("rotation_speed"); rotationSpeed != "" {
		writer.WriteField("rotation_speed", rotationSpeed)
	}
	if numFrames := getFormValue("num_frames"); numFrames != "" {
		writer.WriteField("num_frames", numFrames)
	}
	if fps := getFormValue("fps"); fps != "" {
		writer.WriteField("fps", fps)
	}

	// Rotasyon eksenleri
	if yawEnabled := getFormValue("yaw_enabled"); yawEnabled != "" {
		writer.WriteField("yaw_enabled", yawEnabled)
	}
	if pitchEnabled := getFormValue("pitch_enabled"); pitchEnabled != "" {
		writer.WriteField("pitch_enabled", pitchEnabled)
	}
	if rollEnabled := getFormValue("roll_enabled"); rollEnabled != "" {
		writer.WriteField("roll_enabled", rollEnabled)
	}

	// Rotasyon açı aralıkları
	if yawRange := getFormValue("yaw_range"); yawRange != "" {
		writer.WriteField("yaw_range", yawRange)
	}
	if pitchRange := getFormValue("pitch_range"); pitchRange != "" {
		writer.WriteField("pitch_range", pitchRange)
	}
	if rollRange := getFormValue("roll_range"); rollRange != "" {
		writer.WriteField("roll_range", rollRange)
	}

	// GIF ayarları
	if gifOptimize := getFormValue("gif_optimize"); gifOptimize != "" {
		writer.WriteField("gif_optimize", gifOptimize)
	}
	if gifQuality := getFormValue("gif_quality"); gifQuality != "" {
		writer.WriteField("gif_quality", gifQuality)
	}
	if pauseDuration := getFormValue("pause_duration"); pauseDuration != "" {
		writer.WriteField("pause_duration", pauseDuration)
	}
	if loop := getFormValue("loop"); loop != "" {
		writer.WriteField("loop", loop)
	}

	// Profesyonel Render Parametreleri (hepsini kopyala)
	if quality := getFormValue("render_quality"); quality != "" {
		writer.WriteField("render_quality", quality)
	}
	if antiAliasing := getFormValue("anti_aliasing"); antiAliasing != "" {
		writer.WriteField("anti_aliasing", antiAliasing)
	}
	if edgeDetection := getFormValue("edge_detection"); edgeDetection != "" {
		writer.WriteField("edge_detection", edgeDetection)
	}
	if sharpen := getFormValue("sharpen"); sharpen != "" {
		writer.WriteField("sharpen", sharpen)
	}
	if sharpenIntensity := getFormValue("sharpen_intensity"); sharpenIntensity != "" {
		writer.WriteField("sharpen_intensity", sharpenIntensity)
	}
	if smooth := getFormValue("smooth"); smooth != "" {
		writer.WriteField("smooth", smooth)
	}
	if smoothRadius := getFormValue("smooth_radius"); smoothRadius != "" {
		writer.WriteField("smooth_radius", smoothRadius)
	}
	if contrast := getFormValue("contrast"); contrast != "" {
		writer.WriteField("contrast", contrast)
	}
	if brightness := getFormValue("brightness"); brightness != "" {
		writer.WriteField("brightness", brightness)
	}
	if saturation := getFormValue("saturation"); saturation != "" {
		writer.WriteField("saturation", saturation)
	}
	if ambientOcclusion := getFormValue("ambient_occlusion"); ambientOcclusion != "" {
		writer.WriteField("ambient_occlusion", ambientOcclusion)
	}
	if aoIntensity := getFormValue("ao_intensity"); aoIntensity != "" {
		writer.WriteField("ao_intensity", aoIntensity)
	}
	if shadow := getFormValue("shadow"); shadow != "" {
		writer.WriteField("shadow", shadow)
	}
	if shadowOffsetX := getFormValue("shadow_offset_x"); shadowOffsetX != "" {
		writer.WriteField("shadow_offset_x", shadowOffsetX)
	}
	if shadowOffsetY := getFormValue("shadow_offset_y"); shadowOffsetY != "" {
		writer.WriteField("shadow_offset_y", shadowOffsetY)
	}
	if shadowBlur := getFormValue("shadow_blur"); shadowBlur != "" {
		writer.WriteField("shadow_blur", shadowBlur)
	}
	if shadowOpacity := getFormValue("shadow_opacity"); shadowOpacity != "" {
		writer.WriteField("shadow_opacity", shadowOpacity)
	}
	if vignette := getFormValue("vignette"); vignette != "" {
		writer.WriteField("vignette", vignette)
	}
	if vignetteIntensity := getFormValue("vignette_intensity"); vignetteIntensity != "" {
		writer.WriteField("vignette_intensity", vignetteIntensity)
	}
	if wireframe := getFormValue("wireframe"); wireframe != "" {
		writer.WriteField("wireframe", wireframe)
	}
	if wireframeDensity := getFormValue("wireframe_density"); wireframeDensity != "" {
		writer.WriteField("wireframe_density", wireframeDensity)
	}
	if lightingEnabled := getFormValue("lighting_enabled"); lightingEnabled != "" {
		writer.WriteField("lighting_enabled", lightingEnabled)
	}
	if lightIntensity := getFormValue("light_intensity"); lightIntensity != "" {
		writer.WriteField("light_intensity", lightIntensity)
	}
	if lightColorR := getFormValue("light_color_r"); lightColorR != "" {
		writer.WriteField("light_color_r", lightColorR)
	}
	if lightColorG := getFormValue("light_color_g"); lightColorG != "" {
		writer.WriteField("light_color_g", lightColorG)
	}
	if lightColorB := getFormValue("light_color_b"); lightColorB != "" {
		writer.WriteField("light_color_b", lightColorB)
	}
	if materialMetallic := getFormValue("material_metallic"); materialMetallic != "" {
		writer.WriteField("material_metallic", materialMetallic)
	}
	if materialRoughness := getFormValue("material_roughness"); materialRoughness != "" {
		writer.WriteField("material_roughness", materialRoughness)
	}
	if gradientBackground := getFormValue("gradient_background"); gradientBackground != "" {
		writer.WriteField("gradient_background", gradientBackground)
	}
	if gradientColor1 := getFormValue("gradient_color_1"); gradientColor1 != "" {
		writer.WriteField("gradient_color_1", gradientColor1)
	}
	if gradientColor2 := getFormValue("gradient_color_2"); gradientColor2 != "" {
		writer.WriteField("gradient_color_2", gradientColor2)
	}
	if depthOfField := getFormValue("depth_of_field"); depthOfField != "" {
		writer.WriteField("depth_of_field", depthOfField)
	}
	if dofFocusDistance := getFormValue("dof_focus_distance"); dofFocusDistance != "" {
		writer.WriteField("dof_focus_distance", dofFocusDistance)
	}
	if dofAperture := getFormValue("dof_aperture"); dofAperture != "" {
		writer.WriteField("dof_aperture", dofAperture)
	}
	if bloom := getFormValue("bloom"); bloom != "" {
		writer.WriteField("bloom", bloom)
	}
	if bloomIntensity := getFormValue("bloom_intensity"); bloomIntensity != "" {
		writer.WriteField("bloom_intensity", bloomIntensity)
	}
	if bloomThreshold := getFormValue("bloom_threshold"); bloomThreshold != "" {
		writer.WriteField("bloom_threshold", bloomThreshold)
	}
	if motionBlur := getFormValue("motion_blur"); motionBlur != "" {
		writer.WriteField("motion_blur", motionBlur)
	}
	if motionBlurIntensity := getFormValue("motion_blur_intensity"); motionBlurIntensity != "" {
		writer.WriteField("motion_blur_intensity", motionBlurIntensity)
	}
	if gridOverlay := getFormValue("grid_overlay"); gridOverlay != "" {
		writer.WriteField("grid_overlay", gridOverlay)
	}
	if gridSize := getFormValue("grid_size"); gridSize != "" {
		writer.WriteField("grid_size", gridSize)
	}
	if rulerEnabled := getFormValue("ruler_enabled"); rulerEnabled != "" {
		writer.WriteField("ruler_enabled", rulerEnabled)
	}
	if reflectionIntensity := getFormValue("reflection_intensity"); reflectionIntensity != "" {
		writer.WriteField("reflection_intensity", reflectionIntensity)
	}
	if normalMapIntensity := getFormValue("normal_map_intensity"); normalMapIntensity != "" {
		writer.WriteField("normal_map_intensity", normalMapIntensity)
	}
	if fog := getFormValue("fog"); fog != "" {
		writer.WriteField("fog", fog)
	}
	if fogDensity := getFormValue("fog_density"); fogDensity != "" {
		writer.WriteField("fog_density", fogDensity)
	}
	if fogColor := getFormValue("fog_color"); fogColor != "" {
		writer.WriteField("fog_color", fogColor)
	}

	writer.Close()

	// Python API'ye istek gönder (/render-cached endpoint'ine!)
	apiURL := fmt.Sprintf("%s/render-cached", freecadAPIURL)
	req, err := http.NewRequest("POST", apiURL, &requestBody)
	if err != nil {
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "API isteği oluşturulamadı",
		})
	}

	req.Header.Set("Content-Type", writer.FormDataContentType())

	// HTTP client (uzun timeout)
	client := &http.Client{
		Timeout: 300 * time.Second, // 5 dakika timeout
	}

	resp, err := client.Do(req)
	if err != nil {
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "FreeCAD API'ye bağlanılamadı",
		})
	}
	defer resp.Body.Close()

	// Hata kontrolü
	if resp.StatusCode != 200 {
		fmt.Printf("[RENDER-CACHED ERROR] Python API error: %d\n", resp.StatusCode)
		responseBody, _ := io.ReadAll(resp.Body)
		return c.Status(resp.StatusCode).JSON(fiber.Map{
			"success": false,
			"error":   string(responseBody),
			"message": "Render hatası",
		})
	}

	fmt.Println("[RENDER-CACHED] Python API response 200, reading GIF...")

	// GIF'i memory'ye al
	gifData, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("[RENDER-CACHED ERROR] ReadAll error: %v\n", err)
		return c.Status(500).JSON(fiber.Map{
			"success": false,
			"error":   err.Error(),
			"message": "GIF okunamadı",
		})
	}

	fmt.Printf("[RENDER-CACHED] GIF read successfully (%d bytes)\n", len(gifData))

	// GIF'i döndür
	c.Set("Content-Type", "image/gif")
	c.Set("Content-Length", fmt.Sprintf("%d", len(gifData)))
	c.Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"render_%s.gif\"", fileID))

	fmt.Println("[RENDER-CACHED] Sending GIF to client...")
	return c.Send(gifData)
}
