// SSL-Verbindungen akzeptieren (selbstsignierte Zertifikate)
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

// Basis-URL für Backend-API
// Backend läuft auf separatem Server unter https://192.168.0.105:443
const getApiBaseUrl = () => {
  // Explizit gesetzte Umgebungsvariable hat höchste Priorität
  if (process.env.NEXT_PUBLIC_API_URL) {
    return process.env.NEXT_PUBLIC_API_URL;
  }
  
  // Primäre Backend-URL: Separater Server
  const BACKEND_SERVER_URL = 'https://192.168.0.105:443';
  
  // Im Browser: Verwende primär den separaten Backend-Server
  if (typeof window !== 'undefined') {
    // Verbindungsoptionen in Prioritätsreihenfolge
    return {
      primary: BACKEND_SERVER_URL,
      fallbacks: [
        `https://192.168.0.105`,  // Fallback ohne expliziten Port
        `https://raspberrypi`,    // Lokaler Raspberry Pi Fallback
      ]
    };
  }
  
  // Standardwert für serverseitiges Rendering: Separater Backend-Server
  return BACKEND_SERVER_URL;
};

export const API_BASE_URL = getApiBaseUrl();

// Frontend-URL für Callbacks - unterstützt mehrere Domains
const getFrontendUrl = () => {
  // Priorität 1: Explizit gesetzte Umgebungsvariable
  if (process.env.NEXT_PUBLIC_FRONTEND_URL) {
    return process.env.NEXT_PUBLIC_FRONTEND_URL;
  }
  
  // Priorität 2: Spezifischer Hostname für das Netzwerk
  if (typeof window !== 'undefined') {
    // Im Browser: Prüfen auf m040tbaraspi001.de040.corpintra.net
    const hostname = window.location.hostname;
    if (hostname === 'm040tbaraspi001' || 
        hostname === 'm040tbaraspi001.de040.corpintra.net' ||
        hostname.includes('corpintra.net')) {
      return `https://${hostname}`;
    }
  }
  
  // Priorität 3: Default für Localhost (development)
  return "https://m040tbaraspi001.de040.corpintra.net";
};

export const FRONTEND_URL = getFrontendUrl();

// OAuth Callback URL - muss exakt mit der registrierten URL in GitHub übereinstimmen
export const OAUTH_CALLBACK_URL = process.env.NEXT_PUBLIC_OAUTH_CALLBACK_URL || 
                                 `${FRONTEND_URL}/auth/login/callback`;

// Liste der erlaubten Hostnamen für OAuth-Callbacks
export const ALLOWED_CALLBACK_HOSTS = [
  'localhost',
  'm040tbaraspi001',
  'm040tbaraspi001.de040.corpintra.net',
  '192.168.0.105'
];

// Funktion zum Testen der SSL-Verbindung
export const testSSLConnection = async (): Promise<boolean> => {
  try {
    // Bei mehreren Verbindungsoptionen alle testen
    if (typeof API_BASE_URL === 'object' && API_BASE_URL.primary && API_BASE_URL.fallbacks) {
      // Zuerst primäre Verbindung testen
      try {
        const response = await fetch(`${API_BASE_URL.primary}/health`, {
          method: 'GET',
          mode: 'no-cors',
        });
        // Wenn kein Fehler auftritt, ist die primäre Verbindung erfolgreich
        return true;
      } catch (primaryError) {
        console.warn('Primäre SSL-Verbindung fehlgeschlagen, versuche Fallbacks:', primaryError);
        
        // Fallbacks durchprobieren
        for (const fallbackUrl of API_BASE_URL.fallbacks) {
          try {
            const response = await fetch(`${fallbackUrl}/health`, {
              method: 'GET',
              mode: 'no-cors',
            });
            // Wenn kein Fehler auftritt, ist die Fallback-Verbindung erfolgreich
            return true;
          } catch (fallbackError) {
            // Fehlgeschlagenen Fallback ignorieren und nächsten versuchen
            console.warn(`Fallback ${fallbackUrl} fehlgeschlagen:`, fallbackError);
          }
        }
        
        // Alle Fallbacks fehlgeschlagen
        return false;
      }
    } else {
      // Einfacher Verbindungstest für String-URL
      const response = await fetch(`${API_BASE_URL}/health`, {
        method: 'GET',
        mode: 'no-cors',
      });
      return true;
    }
  } catch (error) {
    console.warn('SSL-Verbindungstest fehlgeschlagen:', error);
    return false;
  }
};

// Hilfsfunktion zum Erstellen vollständiger API-URLs
export const getFullApiUrl = (endpoint: string): string => {
  const baseUrl = typeof API_BASE_URL === 'object' ? API_BASE_URL.primary : API_BASE_URL;
  return `${baseUrl}${endpoint}`;
};

// Endpunkte für die verschiedenen Ressourcen
export const API_ENDPOINTS = {
  PRINTERS: getFullApiUrl(`/api/printers`),
  JOBS: getFullApiUrl(`/api/jobs`),
  USERS: getFullApiUrl(`/api/users`),
  HEALTH: getFullApiUrl(`/health`),
  
  // OAuth-spezifische Endpunkte
  AUTH: {
    LOGIN: getFullApiUrl(`/api/auth/login`),
    CALLBACK: getFullApiUrl(`/api/auth/callback`),
  }
};