<?php

namespace App\Classes\General;

use Illuminate\Http\Resources\Json\ResourceCollection;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use NumberToWords\NumberToWords;

class Helper
{

    /**
     * @param string $methodName
     * @return string
     */
    static function getPropertyName(string $methodName){
        return Str::snake(str_replace('get', '', $methodName));
    }

    /**
     * @param string $className
     * @return array
     */
    static function getClassMethodsArray(string $className){
        return array_slice(get_class_methods($className), 1);
    }

    /**
     * @param $log
     * @return array
     */
    static function debugLogger($log){
        if($log && isset($log['message'])){
            $message = $log['message'];
            $substring = 'No data were found';
            if (isset($message)) {
                if (strpos($message, $substring) !== false) {
                    // Log::info('Message exist');
                } else {
                    Log::info($log['message']);
                }
            }
        }
    }

    /**
     * @param null|string $param
     * @return array
     */
    static function deserializeFilters($param): array {
        if(gettype($param) == "array"){
            $json = implode(',', $param);
        }
        else{
            $json = $param;
        }
        return $json !== null ? collect(json_decode($json))->toArray() : [];
    }

    /**
     * @param ResourceCollection $collection
     * @return array
     */
    static function collectionResponse(ResourceCollection $collection){
        return json_decode($collection->response()->getContent(), true);
    }

    /**
     * Convert a given number to words based on the specified locale.
     *
     * @param int|float $number
     * @param string $locale The locale to use for conversion (default is 'en').
     * @return string
     */
    static function convert($number, $locale = 'en')
    {
        $numberToWords = new NumberToWords();
        $numberTransformer = $numberToWords->getNumberTransformer($locale);

        $number = number_format((float)$number, 2, '.', '');
        [$ringgit, $cents] = explode('.', $number);

        $ringgitWords = $numberTransformer->toWords((int)$ringgit);
        $centsWords = $numberTransformer->toWords((int)$cents);

        return strtoupper('ringgit malaysia ' . $ringgitWords . ' and ' . $centsWords . ' cents only');
    }

    public static function getLHDNStateCodeByName($name)
    {
        $path = resource_path('data/lhdn/StateCodes.json');

        if (!file_exists($path)) {
            return null;
        }

        $json = file_get_contents($path);
        $data = json_decode($json, true);

        if (!is_array($data)) {
            return null;
        }

        $name = strtolower(trim($name));

        // Step 1: Try exact match
        foreach ($data as $item) {
            if (
                isset($item['State']) &&
                strtolower(trim($item['State'])) === $name
            ) {
                return $item['Code'] ?? null;
            }
        }

        // Step 2: Try partial match
        foreach ($data as $item) {
            if (
                isset($item['State']) &&
                str_contains(strtolower($item['State']), $name)
            ) {
                return $item['Code'] ?? null;
            }
        }

        return null;
    }

    public static function getLHDNMsicDescriptionByCode($code)
    {
        $path = resource_path('data/lhdn/MSICSubCategoryCodes.json');

        if (!file_exists($path)) {
            return null;
        }

        $json = file_get_contents($path);
        $data = json_decode($json, true);

        if (!is_array($data)) {
            return null;
        }

        foreach ($data as $item) {
            if (
                isset($item['Code']) &&
                $item['Code'] === $code
            ) {
                return $item['Description'] ?? null;
            }
        }

        return null;
    }

}
