package uyar_admin

import (
	"bytes"
	"crypto/tls"
	"io"
	"net/http"
	admin_kullanicilar "server/apps/uyar_dokum/uyar/uyar_admin/kullanicilar"
	kokn8n "server/apps/uyar_dokum/uyar/uyar_admin/n8n"
	"time"

	"github.com/gofiber/fiber/v3"
)

// SSL doğrulamasını devre dışı bırakan HTTP client
var insecureClient = &http.Client{
	Transport: &http.Transport{
		TLSClientConfig: &tls.Config{
			InsecureSkipVerify: true, // Self-signed sertifikayı kabul et
		},
	},
	Timeout: 30 * time.Second,
}

func Init(app *fiber.App, Uyar fiber.Router) {
	Api := Uyar.Group("/admin")

	admin_kullanicilar.Init(app, Api)
	kokn8n.Kokn8nRouting(app, Api)

	Api.Get("/everything", func(c fiber.Ctx) error {
		// Angular'dan gelen query parametrelerini Everything'e geçir
		query := c.Context().QueryArgs().String() // ?search=*.nc&c=5 gibi tüm query string
		everythingURL := "https://85.105.225.163:7575/?" + query

		// InsecureClient ile HTTP GET isteği
		resp, err := insecureClient.Get(everythingURL)
		if err != nil {
			return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{
				"error":  "Everything server unreachable",
				"detail": err.Error(),
			})
		}
		defer resp.Body.Close()

		// Status code'u kontrol et
		if resp.StatusCode != http.StatusOK {
			return c.Status(resp.StatusCode).JSON(fiber.Map{
				"error":  "Everything server error",
				"status": resp.StatusCode,
			})
		}

		body, err := io.ReadAll(resp.Body)
		if err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
				"error":  "Failed to read response",
				"detail": err.Error(),
			})
		}

		// Content-Type'ı ilet
		c.Set("Content-Type", resp.Header.Get("Content-Type"))

		return c.Send(body)
	})

	Api.Get("/everything/file/*", func(c fiber.Ctx) error {
		// frontend'den gelen dosya yolu
		filePath := c.Params("*") // C:/Users/user/Desktop/KIRMIZI/KIRMIZI.NC

		// Everything server URL'si
		everythingURL := "https://85.105.225.163:7575/" + filePath

		// InsecureClient ile HTTP GET isteği
		resp, err := insecureClient.Get(everythingURL)
		if err != nil {
			return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{
				"error":  "Everything server unreachable",
				"detail": err.Error(),
			})
		}
		defer resp.Body.Close()

		// Status code'u kontrol et
		if resp.StatusCode != http.StatusOK {
			return c.Status(resp.StatusCode).JSON(fiber.Map{
				"error":  "File not found or server error",
				"status": resp.StatusCode,
			})
		}

		// Header'ları ilet
		c.Set("Content-Type", resp.Header.Get("Content-Type"))
		c.Set("Content-Disposition", resp.Header.Get("Content-Disposition"))
		c.Set("Content-Length", resp.Header.Get("Content-Length"))

		// Body'yi gönder
		body, err := io.ReadAll(resp.Body)
		if err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
				"error":  "Failed to read file",
				"detail": err.Error(),
			})
		}

		return c.Send(body)
	})

	Api.Post("/filebrowser/login", func(c fiber.Ctx) error {
		// Angular'dan gelen body'yi al
		body := c.Body()

		// Filebrowser login endpointine gönder
		url := "https://85.105.225.163:7575/files/api/login"
		req, err := http.NewRequest("POST", url, bytes.NewReader(body))
		if err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
				"error": err.Error(),
			})
		}
		req.Header.Set("Content-Type", "application/json")

		resp, err := insecureClient.Do(req)
		if err != nil {
			return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{
				"error":  "Filebrowser unreachable",
				"detail": err.Error(),
			})
		}
		defer resp.Body.Close()

		responseBody, _ := io.ReadAll(resp.Body)

		c.Status(resp.StatusCode)
		c.Set("Content-Type", resp.Header.Get("Content-Type"))

		return c.Send(responseBody)
	})

	// Api.All("/filebrowser/*", func(c fiber.Ctx) error {
	// 	// Gelen isteği birebir proxy et
	// 	targetURL := "https://85.105.225.163:7575//files/" + c.Params("*")

	// 	req, err := http.NewRequest(c.Method(), targetURL, bytes.NewReader(c.Body()))
	// 	if err != nil {
	// 		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	// 	}

	// 	// Header'ları kopyala
	// 	c.Request().Header.VisitAll(func(k, v []byte) {
	// 		req.Header.Set(string(k), string(v))
	// 	})

	// 	resp, err := insecureClient.Do(req)
	// 	if err != nil {
	// 		return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
	// 	}
	// 	defer resp.Body.Close()

	// 	// Response header’larını ilet
	// 	for k, v := range resp.Header {
	// 		for _, vv := range v {
	// 			c.Set(k, vv)
	// 		}
	// 	}

	// 	responseBody, _ := io.ReadAll(resp.Body)
	// 	return c.Status(resp.StatusCode).Send(responseBody)
	// })

}
