package uyar_admin

import (
	"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)
	})
}
