/**
 * Device-local layer state — was tatsächlich an/aus ist auf dem Gerät.
 * Plattform-spezifisch: iOS hat urlFilter+familyControls, Android hat
 * vpn+accessibility+tamperLock. Felder die auf der jeweils anderen
 * Plattform irrelevant sind, sind undefined.
 */
export type DeviceLayers = {
  // iOS
  urlFilter?: boolean;
  familyControls?: boolean;
  appDeletionLock?: boolean;
  /**
   * Layer 2 — iOS-only. True wenn der ManagedSettings-webContent-Filter eine
   * FilterPolicy ≠ .none gesetzt hat (kuratierte Gambling-Domain-Liste aktiv).
   */
  webContentFilter?: boolean;
  /**
   * iOS-only. True wenn MDM einen managed VPN/Tunnel-Provider mit unserer
   * PacketTunnelExtension Bundle-ID pushed hat. Erkannt heuristisch via
   * `NETunnelProviderManager.loadAllFromPreferences().count > 1` — App selbst
   * kann nur einen eigenen Manager erstellen, ein zusätzlicher MDM-Push
   * fügt einen zweiten hinzu. Konsequenz für UI: bei mdmManaged=true ist
   * der per-App-FC-Authorization-Toggle irrelevant für den Schutz (Schutz
   * läuft via MDM-managed VPN-Layer), die Locked-In-Card kann unabhängig
   * vom familyControls/appDeletionLock-Status angezeigt werden.
   */
  mdmManaged?: boolean;
  /**
   * iOS-only (Build 19). True wenn ein NEContentFilterConfiguration-Profil
   * aktiv ist — egal ob via App-Code oder via sideloaded/MDM-Profile.
   * Primary state-source für blocker.tsx: wenn true → UI all-green,
   * kein manueller Activate-Button nötig.
   */
  nefilterActive?: boolean;
  /** Lokalisierter Beschreibungsstring des aktiven NEFilter-Profils. */
  nefilterDescription?: string;
  // Android
  vpn?: boolean;
  accessibility?: boolean;
  tamperLock?: boolean;
  /** Android-only. True wenn RebreakDeviceAdminReceiver aktiver Geraeteadministrator ist.
   *  Schliesst die Boot-Luecke: ohne aktiven Admin hat die App nach Neustart
   *  kurz kein Schutz-Lock bis der AccessibilityService startet. */
  deviceAdmin?: boolean;
  /** Android-only. True wenn die App von der Akku-Optimierung ausgenommen ist
   *  (PowerManager.isIgnoringBatteryOptimizations). Ohne Ausnahme schläfert
   *  Samsung & Co. die App ein → a11y-Service wird entbunden → Schutz fällt
   *  still aus. (Samsung „Schlafende Apps" ist zusätzlich separat — App-Detail-
   *  Guide.) */
  batteryUnrestricted?: boolean;
  // Shared
  blocklistCount: number;
  blocklistLastSyncAt: string | null;
};

/**
 * Ergebnis von applyWebContentFilter (iOS Layer 2).
 * `enabled` = Filter wurde gesetzt. `appliedCount` = wie viele Domains
 * tatsächlich an blockedByFilter gingen (≤50, Apple-Hartlimit).
 * `region` = das per Locale.current.region bestimmte Land.
 */
export type WebContentFilterResult = {
  enabled: boolean;
  appliedCount: number;
  region: string;
  error?: string;
};

export type ActivateResult = {
  allLayersOn: boolean;
  /**
   * Welche Layer der User noch aktivieren muss (z.B. weil ein
   * System-Permission-Dialog abgelehnt wurde). Wenn allLayersOn=true → leer.
   */
  missingLayers: ProtectionLayerKey[];
  /**
   * Detaillierte Native-Errors für UX-relevante Diagnose. Leer wenn alle
   * Layers durchgekommen sind. Beispiele: NEFilter saveToPreferences-Failure,
   * Family Controls Authorization denied.
   */
  errors?: string[];
};

export type DisableResult = {
  allLayersOff: boolean;
};

export type ProtectionLayerKey =
  | "urlFilter"
  | "familyControls"
  | "appDeletionLock"
  | "vpn"
  | "accessibility"
  | "tamperLock";

export type SyncBlocklistOpts = {
  baseURL: string;
  authToken: string;
};

export type SyncBlocklistResult = {
  updated: boolean;
  count: number;
  plan?: string;
};

/**
 * Opts für syncWebContentDomains (iOS Layer 2). Gleiche Shape wie
 * SyncBlocklistOpts — baseURL + authToken kommen aus der Supabase-Session.
 */
export type SyncWebContentDomainsOpts = {
  baseURL: string;
  authToken: string;
};

/**
 * Ergebnis von syncWebContentDomains (iOS Layer 2).
 * `updated` = neue Liste wurde heruntergeladen + gecached (false bei 304).
 * `countries` = Anzahl Country-Keys in der Response.
 * `version` = `_meta.version` der Backend-Response.
 * `reapplied` = applyWebContentLayer() wurde nach dem Sync erneut ausgeführt
 *   (nur wenn Family Controls authorisiert ist).
 */
export type SyncWebContentDomainsResult = {
  updated: boolean;
  countries?: number;
  version?: number;
  reapplied?: boolean;
};

export type HealthProbeOutcome = "blocked" | "loaded" | "offline" | "timeout";

export type HealthProbeOpts = {
  /** Default: https://bet365.com — sollte sicher in der Blocklist stehen. */
  target?: string;
  /** Default 5s. */
  timeoutSeconds?: number;
};

export type HealthProbeResult = {
  outcome: HealthProbeOutcome;
  reason: string;
  durationMs: number;
  target: string;
};

export type SystemSettingsTarget =
  /** Android: Settings → Network → VPN. */
  | "vpn"
  /** Android: Settings → Accessibility (Bedienungshilfen). */
  | "accessibility"
  /** iOS: Settings → Screen Time → Family Controls. */
  | "screenTime"
  /** iOS+Android: App-Notifications-Settings. */
  | "notifications";

/**
 * Events die das native Modul fired wenn sich Device-Layer State ändert
 * (z.B. User schaltet VPN extern aus, deaktiviert A11y, oder NEFilter-Config
 * wurde von außen entfernt). Der App-State-Watchdog hängt darauf.
 */
export type RebreakProtectionEvents = {
  onLayerChange: (state: DeviceLayers) => void;
};
