Files
BarangaySystem/app/Support/IslandGroupHelper.php
2026-06-06 18:43:00 +08:00

124 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Support;
class IslandGroupHelper
{
public const LUZON = 'luzon';
public const VISAYAS = 'visayas';
public const MINDANAO = 'mindanao';
/**
* Map of region location_key (lowercased) → island group key.
* Covers common name variants (e.g., "ncr" / "national capital region").
*/
private const REGION_TO_ISLAND = [
// Luzon
'ncr' => self::LUZON,
'national capital region' => self::LUZON,
'metro manila' => self::LUZON,
'car' => self::LUZON,
'cordillera administrative region' => self::LUZON,
'region i' => self::LUZON,
'region 1' => self::LUZON,
'ilocos region' => self::LUZON,
'region ii' => self::LUZON,
'region 2' => self::LUZON,
'cagayan valley' => self::LUZON,
'region iii' => self::LUZON,
'region 3' => self::LUZON,
'central luzon' => self::LUZON,
'region iv-a' => self::LUZON,
'region 4-a' => self::LUZON,
'region iva' => self::LUZON,
'calabarzon' => self::LUZON,
'region iv-b' => self::LUZON,
'region 4-b' => self::LUZON,
'region ivb' => self::LUZON,
'mimaropa' => self::LUZON,
'mimaropa region' => self::LUZON,
'region v' => self::LUZON,
'region 5' => self::LUZON,
'bicol region' => self::LUZON,
// Visayas
'region vi' => self::VISAYAS,
'region 6' => self::VISAYAS,
'western visayas' => self::VISAYAS,
'region vii' => self::VISAYAS,
'region 7' => self::VISAYAS,
'central visayas' => self::VISAYAS,
'region viii' => self::VISAYAS,
'region 8' => self::VISAYAS,
'eastern visayas' => self::VISAYAS,
// Mindanao
'region ix' => self::MINDANAO,
'region 9' => self::MINDANAO,
'zamboanga peninsula' => self::MINDANAO,
'region x' => self::MINDANAO,
'region 10' => self::MINDANAO,
'northern mindanao' => self::MINDANAO,
'region xi' => self::MINDANAO,
'region 11' => self::MINDANAO,
'davao region' => self::MINDANAO,
'region xii' => self::MINDANAO,
'region 12' => self::MINDANAO,
'soccsksargen' => self::MINDANAO,
'region xiii' => self::MINDANAO,
'region 13' => self::MINDANAO,
'caraga' => self::MINDANAO,
'barmm' => self::MINDANAO,
'bangsamoro' => self::MINDANAO,
'bangsamoro autonomous region in muslim mindanao' => self::MINDANAO,
'armm' => self::MINDANAO,
];
private const ISLAND_LABELS = [
self::LUZON => 'Luzon',
self::VISAYAS => 'Visayas',
self::MINDANAO => 'Mindanao',
];
private const ISLAND_CENTERS = [
self::LUZON => ['lat' => 16.5, 'lng' => 121.0],
self::VISAYAS => ['lat' => 11.0, 'lng' => 123.5],
self::MINDANAO => ['lat' => 7.5, 'lng' => 124.5],
];
public static function islands(): array
{
return [self::LUZON, self::VISAYAS, self::MINDANAO];
}
public static function label(string $island): string
{
return self::ISLAND_LABELS[$island] ?? ucfirst($island);
}
public static function center(string $island): array
{
return self::ISLAND_CENTERS[$island] ?? ['lat' => 12.0, 'lng' => 122.5];
}
/**
* Resolve an island group from a region's location_key or name.
* Returns null if it can't be matched (caller should bucket as "unassigned").
*/
public static function fromRegion(?string $regionKeyOrName): ?string
{
if (!$regionKeyOrName) return null;
$key = strtolower(trim($regionKeyOrName));
if (isset(self::REGION_TO_ISLAND[$key])) {
return self::REGION_TO_ISLAND[$key];
}
// Loose substring match for entries like "Region IV-A (CALABARZON)"
foreach (self::REGION_TO_ISLAND as $needle => $island) {
if (str_contains($key, $needle)) return $island;
}
return null;
}
}