package routes

import (
	"bssapp-backend/db"
	"bssapp-backend/queries"
	"context"
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"sort"
	"time"
)

// ✅ GET /api/order-inventory?code=...&color=...&color2=...
func GetOrderInventoryHandler(w http.ResponseWriter, r *http.Request) {
	code := r.URL.Query().Get("code")
	color := r.URL.Query().Get("color")
	color2 := r.URL.Query().Get("color2")

	if code == "" {
		http.Error(w, "Eksik parametre: code gerekli", http.StatusBadRequest)
		return
	}

	// 🔧 Normalize eksik renk parametreleri
	if color == "" {
		color = " "
	}
	if color2 == "" {
		color2 = " "
	}

	log.Printf("🎨 [ORDERINV] İstek alındı -> code=%q | color=%q | color2=%q", code, color, color2)

	// ✅ MSSQL bağlantısını ve timeout'u oluştur
	ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
	defer cancel()

	rows, err := db.MssqlDB.QueryContext(ctx, queries.GetOrderInventory, code, color, color2)
	if err != nil {
		log.Printf("❌ [ORDERINV] SQL çalıştırılamadı: %v", err)
		http.Error(w, "SQL hatası: "+err.Error(), http.StatusInternalServerError)
		return
	}
	defer func() {
		if cerr := rows.Close(); cerr != nil {
			log.Printf("⚠️ [ORDERINV] rows.Close() hatası: %v", cerr)
		}
	}()

	type Row struct {
		UrunKodu           string  `json:"UrunKodu"`
		RenkKodu           string  `json:"RenkKodu"`
		RenkAciklamasi     string  `json:"RenkAciklamasi"`
		Beden              string  `json:"Beden"`
		Yaka               string  `json:"Yaka"`
		KullanilabilirAdet float64 `json:"KullanilabilirAdet"`
	}

	var list []Row
	for rows.Next() {
		var r Row
		if err := rows.Scan(
			&r.UrunKodu,
			&r.RenkKodu,
			&r.RenkAciklamasi,
			&r.Beden,
			&r.Yaka,
			&r.KullanilabilirAdet,
		); err != nil {
			log.Printf("⚠️ [ORDERINV] Scan hatası: %v", err)
			continue
		}
		list = append(list, r)
	}

	if err := rows.Err(); err != nil {
		log.Printf("❌ [ORDERINV] Rows hatası: %v", err)
		http.Error(w, "Veri okuma hatası: "+err.Error(), http.StatusInternalServerError)
		return
	}

	// Debug: beden/adet özetini tek satırda yazdır (saha doğrulaması için)
	if len(list) > 0 {
		keys := make([]string, 0, len(list))
		for _, it := range list {
			keys = append(keys, fmt.Sprintf("%s:%g", it.Beden, it.KullanilabilirAdet))
		}
		sort.Strings(keys)
		log.Printf("🔎 [ORDERINV] beden/qty -> %s", keys)
	}

	log.Printf("✅ [ORDERINV] %s / %s / %s -> %d kayıt döndü", code, color, color2, len(list))

	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	if err := json.NewEncoder(w).Encode(list); err != nil {
		log.Printf("❌ [ORDERINV] JSON encode hatası: %v", err)
		http.Error(w, "JSON encode başarısız", http.StatusInternalServerError)
	}
}
