<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\GenericBackoffice\WebsiteObject;
use App\Models\GenericBackoffice\WebsiteObjectLanguage;
use App\Models\Country;
use App\Models\CountryLanguage;
use Config;

class SeedCountries extends Command
{
    const REGION1 = 'Andorra, Belgien, Bulgarien, Dänemark, Deutschland, Estland, Färöer, Finnland, Frankreich, Gibraltar, Griechenland, Grönland, Grossbritannien, Guernsey, Irland, Island, Isle of Man, Italien, Jersey, Kanada, Kroatien, Lettland, Liechtenstein, Litauen, Luxemburg, Malta, Monaco, Niederlande, Norwegen, Österreich, Polen, Portugal, Rumänien, Russland, San Marino, Schweden, Slowakei, Slowenien, Spanien, Tschechische Republik, Türkei, Ungarn, USA, Vatikanstadt, Zypern';
    const REGION2 = 'Albanien, Algerien, Ägypten, Australien, Bahrain, Bosnien-Herzegowina, Israel, Jemen, Jordanien, Kosovo, Libanon, Libyen, Marokko, Mazedonien, Montenegro, Palästina, Oman, Qatar, Saudi-Arabien, Serbien, Vereinigte Arabische Emirate';
    const REGION3 = 'Afghanistan, Angola, Anguila, Antiqua, Barbuda, Argentinien, Armenien, Aruba, Aserbaidschan, Äthiopien, Bahamas, Bangladesch, Barbados, Belize, Benin, Bermudas, Bhutan, Bolivien, Botswana, Brasilien, Brazzaville, Brunei, Burkina Faco, Burundi, Cayman Islands, Chile, China, Cookinseln, Costa Rica, Dem. Republik, Dschibuti, Dominica, Ecuador, El Salvador, Elfenbeinküste, Fidschi, Französisch-Guyana, Französisch-Polynesien, Französisch Antillen, Gabun, Gambia, Georgien, Ghana, Grenada, Guatemala, Guayana, Guinea, Guinea Bissau, Haiti, Honduras, Hongkong, Indien, Indonesien, Iran, Irak, Jamaika, Japan, Jungferninseln (GB), Kambodscha, Kamerun, Kapverd. Inseln, Kolumbien, Kongo, Kuba, Kasachstan, Kenia, Korea Süd, Kuwait, Kirgisistan, Laus, Liberia, Macao, Madagaskar, Malawi, Malaysia, Malediven, Mali, Martinique, Mauretanien, Mauritius, Mayotte, Mexiko, Moldawien, Mongolei, Montserrat, Mosambik, Namibia, Nauru, Nepal, Niederl. Antillen, Neukaledonien, Neuseeland, Nicaragua, Niger, Nigeria, Pakistan, Panama, Papua-Neuguinea, Paraguay, Peru, Philippinen, Réunion, Rwanda, Saint Barthélemy, Saint Kitts and Nevis, Saint Martin, St. Vincent und die Grenadinen, Sambia, Samoa, Santa Lucia, São Tomé und Príncipe, Senegal, Seychellen, Sierra Leone, Singapur, Südafrika, Sri Lanka, Sudan, Suriname, Swasiland, Taiwan, Tadschikistan, Tansania, Thailand, Togo, Trinidad und Tobago, Tunesien, Turkmenistan, Turks and Caicos Islands, Uganda, Ukraine, Uruguay, Usbekistan, Vanuatu, Venezuela, Vietnam, Weissrussland, Zentralafrik. Rep. Tschad , Zimbabwe';
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'aldi:seed-countries';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Fill countries';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->langs = array_keys(getAvailableLanguages());
        $this->defaultLang = 'de'; //getDefaultLanguage();
        $countries = [];

        // load countries lists
        foreach ($this->langs as $lang) {
            $countries[$lang] = json_decode(file_get_contents("resources/json/countries-$lang.json"), true);
        }

        foreach ($countries[$this->defaultLang] as $code => $name) {
            if (Country::where('code', $code)->count()) {
                continue;
            }

            $country = new Country();
            $country->code = $code;
            if (strpos(self::REGION1, $name) !== FALSE) {
                $country->region = 1;
            } else if (strpos(self::REGION2, $name) !== FALSE) {
                $country->region = 2;
            } else if (strpos(self::REGION3, $name) !== FALSE) {
                $country->region = 3;
            } 
            $country->save();

            foreach ($this->langs as $lang) {
                $countryLang = new CountryLanguage();
                $countryLang->country_id = $country->id;
                $countryLang->language_id = $lang;
                $countryLang->title = $countries[$lang][$code];
                $countryLang->save();
            }
            $this->generateWo($country->id, 'App\Models\Country', 'country', urlize($country->title));
        }
    }

    protected function generateWo($id, $objectType, $contentType, $slug, $isDraft = false) {
        $obj = new WebsiteObject();
        $contentConfig = Config::get('backoffice/generic/' . $contentType);

        $baseUri = '';
        if (!empty($contentConfig['baseUri'][1][$this->defaultLang])) {
            $baseUri = $contentConfig['baseUri'][1][$this->defaultLang] . '/';
        }
        $i = 0;
        $suffix = '';
        while(
            WebsiteObject::where('slug', $slug . $suffix)
                ->first()
        ) {
            $i++;
            $suffix = "-$i";
        }
        $slug = $slug . $suffix;

        $obj->object_id = $id;
        $obj->object_type = $objectType;
        $obj->slug = $slug;
        $obj->status = $isDraft ? 'draft' : 'published';
        $obj->content_type = $contentType;
        $obj->uri = $baseUri . '/' . $slug;
        $obj->save();
        foreach ($this->langs as $lang) {
            $baseUri = '';
            if (!empty($contentConfig['baseUri'][1][$lang])) {
                $baseUri = $contentConfig['baseUri'][1][$lang] . '/';
            }

            $langObject = new WebsiteObjectLanguage();
            $langObject->website_object_id = $obj->website_object_id;
            $langObject->wo_language_id = $lang;

            $i = 0;
            $suffix = '';
            $slug = $obj->slug;
            while(
                WebsiteObjectLanguage::where('lang_slug', $slug . $suffix)
                    ->where('wo_language_id', $lang)
                    ->first()
            ) {
                $i++;
                $suffix = "-$i";
            }
            $slug = $slug . $suffix;
            $langObject->lang_slug = $slug;
            $langObject->lang_uri = $baseUri . $obj->slug;
            $langObject->save();
        }
    }
}
