<?php

use Illuminate\Database\Seeder;
use App\Language;

class ConvertLanguage extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $listEn = $this->readingLanguageFile('en');
        $listJa = $this->readingLanguageFile('ja');

        if (!isset($listEn[0])) {
            print "Language file is invalid.\r\n";
            exit();
        }

        $count = 0;
        $listLangEn = $this->getArrayLang('', $listEn[0]);
        $listLangJa = [];
        if (isset($listJa[0])) $listLangJa = $this->getArrayLang('', $listJa[0]);
        $logMsg = "";

        if (count($listLangEn) > 0) {
            foreach ($listLangEn as $kLang => $item) {
                $checkItem = Language::where('key', $kLang)->count();
                $jaLangStr = "";
                if (isset($listLangJa[$kLang])) {
                    $jaLangStr = $listLangJa[$kLang];
                } else {
                    $logMsg .= "Ja Missing: [" . $kLang . "]\r\n";
                }
                $langData = [
                    'key'        => $kLang,
                    'en'         => $item,
                    'ja'         => $jaLangStr,
                    'user_id'    => 1,
                    'updated_at' => date('Y-m-d H:i:s')
                ];

                if ($checkItem <= 0) {
                    $langData['created_at'] = $langData['updated_at'];
                    Language::create($langData);
                    $count ++;
                } else {
                    Language::where('key', $kLang)->update($langData);
                }
            }
        }

        print "Language Imported: " . $count . " items.\r\nError: \r\n" . $logMsg;
    }

    private function readingLanguageFile($langKey = '') {
        $langFile = resource_path('js/backend/lang/' . $langKey . '.js');
        if (!file_exists($langFile)) return [];

        $jsonContent = "";
        $handle = fopen($langFile, "r");
        while (!feof($handle)) {
            $row = trim(fgets($handle));
            if ($row === null || $row === "" || $row == "/*{importRouterLang}*/" || $row == "/*{importModuleLang}*/") continue;
            $row = str_replace("\r\n", "", $row);
            $row = str_replace("\r", "", $row);
            $row = str_replace("\n", "", $row);
            $row = str_replace("\t", "", $row);
            $row = str_replace("\'", "\|||", $row);
            $row = str_replace('"', '\"', $row);
            $row = str_replace("'", '"', $row);
            $row = str_replace("\|||", "'", $row);
            if (strpos($row, ":") !== false) {
                $arr = explode(":", $row, 2);
                $key = str_replace("'", "", $arr[0]);
                $key = str_replace('"', "", $key);
                $row = '"' . $key . '":' . $arr[1];
            }
            $jsonContent .= $row;
        }
        fclose($handle);

        $jsonContent = str_replace(",}", "}", $jsonContent);
        $jsonContent = str_replace("export default {", "[{", $jsonContent);
        $jsonContent = str_replace("};", "}]", $jsonContent);

        return json_decode($jsonContent, true);
    }

    private function getArrayLang($parentKey, $list)
    {
        $str = [];
        if (is_array($list)) {
            foreach ($list as $k => $item) {
                $rKey = ($parentKey != "") ? $parentKey . "." . $k : $k;
                if (!is_array($item)) {
                    $str[$rKey] = $item;
                } else {
                    $child = $this->getArrayLang($rKey, $item);
                    $str = array_merge($str, $child);
                }
            }
        }

        return $str;
    }
}
