<?php
namespace App\Libraries;

use CodeIgniter\Cache\CacheFactory;
use CodeIgniter\Config\BaseConfig;

class ValueSet {
    private static $cache = null;
    private static string $dataPath = APPPATH . 'Libraries/Data/';
    private static string $cacheKey = 'valueset_all';
    
    private static function getCacheHandler() {
        if (self::$cache === null) {
            $config = config('Cache');
            self::$cache = CacheFactory::getHandler($config);
        }
        return self::$cache;
    }
    
    public static function get(string $name): ?array {
        $all = self::getAll();
        $values = $all[$name]['values'] ?? null;
        if ($values === null) return null;
        return self::format($values);
    }
    
    public static function getRaw(string $name): ?array {
        $all = self::getAll();
        return $all[$name]['values'] ?? null;
    }
    
    public static function getAll(): array {
        $handler = self::getCacheHandler();
        $data = $handler->get(self::$cacheKey);
        
        if ($data !== null) {
            return $data;
        }
        
        $data = self::bundleAll();
        $handler->save(self::$cacheKey, $data, 0);
        return $data;
    }
    
    public static function getLabel(string $lookupName, string $key): ?string {
        $raw = self::getRaw($lookupName);
        if ($raw === null) return null;
        foreach ($raw as $item) {
            if (($item['key'] ?? $item['value'] ?? null) === $key) {
                return $item['value'] ?? $item['label'] ?? null;
            }
        }
        return null;
    }
    
    public static function getOptions(string $lookupName): array {
        $raw = self::getRaw($lookupName);
        if ($raw === null) return [];
        return array_map(function ($item) {
            return [
                'key' => $item['key'] ?? '',
                'value' => $item['value'] ?? $item['label'] ?? '',
            ];
        }, $raw);
    }
    
    public static function transformLabels(array $data, array $fieldMappings): array {
        foreach ($data as &$row) {
            foreach ($fieldMappings as $field => $lookupName) {
                if (isset($row[$field]) && $row[$field] !== null) {
                    $keyValue = $row[$field];
                    $row[$field] = $keyValue;
                    $row[$field . 'Label'] = self::getLabel($lookupName, $keyValue) ?? '';
                }
            }
        }
        return $data;
    }
    
    public static function clearCache(): bool {
        $handler = self::getCacheHandler();
        return $handler->delete(self::$cacheKey);
    }
    
    private static function bundleAll(): array {
        $result = [];
        foreach (glob(self::$dataPath . '*.json') as $file) {
            $name = pathinfo($file, PATHINFO_FILENAME);
            if ($name[0] === '_') continue;
            $data = self::loadFile($file);
            if ($data) {
                $result[$name] = $data;
            }
        }
        return $result;
    }
    
    private static function loadFile(string $path): ?array {
        if (!is_file($path)) return null;
        $content = file_get_contents($path);
        return json_decode($content, true);
    }
    
    private static function format(array $values): array {
        return array_map(fn($v) => [
            'value' => (string) ($v['key'] ?? ''),
            'label' => (string) ($v['value'] ?? $v['label'] ?? '')
        ], $values);
    }
}
