<?php
/**
 * @package Hafenstudios\Wellenbrecher
 */

namespace Hafenstudios\Wellenbrecher\Data;

use Hafenstudios\Wellenbrecher\Support\Uploads;

defined( 'ABSPATH' ) || exit;

/**
 * Laedt die gebundelten Daten-Listen (einmal pro Request, statisch gecacht).
 */
final class Lists {

	/**
	 * @var array<string, array<mixed>>
	 */
	private static array $cache = array();

	/**
	 * Wegwerf-E-Mail-Domains (domain => true). Merge aus der gebundelten
	 * CC0-Liste und - falls per Pro-Auto-Update (W5b, Technik A7) vorhanden -
	 * der grossen strict-Liste unter uploads/wellenbrecher/. Ohne Download-Datei
	 * (Free oder Auto-Update aus) ist das Ergebnis byte-identisch zur gebundelten
	 * Liste.
	 *
	 * @return array<string, bool>
	 */
	public static function disposable_domains(): array {
		if ( ! isset( self::$cache['disposable-domains'] ) ) {
			$bundled = self::load( 'disposable-domains' );

			$extra_path = Uploads::path( 'disposable-extra.php' );
			if ( '' !== $extra_path && is_readable( $extra_path ) ) {
				$extra = require $extra_path;
				if ( is_array( $extra ) ) {
					// Union: gebundelt hat Vorrang (Werte sind ohnehin identisch true).
					$bundled += $extra;
				}
			}

			self::$cache['disposable-domains'] = $bundled;
		}
		return self::$cache['disposable-domains'];
	}

	/**
	 * Bekannte Hosting-/VPS-/Cloud-ASNs (asn_number => true, W5b Technik A8).
	 *
	 * @return array<int, bool>
	 */
	public static function datacenter_asns(): array {
		return self::load( 'datacenter-asns' );
	}

	/**
	 * URL-Shortener-Domains (host => true).
	 *
	 * @return array<string, bool>
	 */
	public static function shortener_domains(): array {
		return self::load( 'shortener-domains' );
	}

	/**
	 * Billig-TLDs (tld => true).
	 *
	 * @return array<string, bool>
	 */
	public static function cheap_tlds(): array {
		return self::load( 'cheap-tlds' );
	}

	/**
	 * Spam-Phrasen-Sets (Format siehe Rules\PhraseSetRule).
	 *
	 * @return array<int, array<string, mixed>>
	 */
	public static function phrase_sets(): array {
		return self::load( 'phrase-sets' );
	}

	/**
	 * Laedt eine Daten-Datei mit statischem Cache.
	 *
	 * @param string $name Dateiname ohne Endung.
	 * @return array<mixed>
	 */
	private static function load( string $name ): array {
		if ( ! isset( self::$cache[ $name ] ) ) {
			$file                 = __DIR__ . '/' . $name . '.php';
			$data                 = is_readable( $file ) ? require $file : array();
			self::$cache[ $name ] = is_array( $data ) ? $data : array();
		}
		return self::$cache[ $name ];
	}
}
