<?php

namespace App\Models\LocalizationManagement;

use App\Models\Traits\Activable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Nicolaslopezj\Searchable\SearchableTrait;
use Staudenmeir\EloquentHasManyDeep\HasManyDeep;

class Country extends Model{
    use HasFactory, SearchableTrait,Activable;

    protected $table = "localization_mgt__countries";
    protected $guarded = [];

    protected $searchable = [
        'columns' => [
            'countries.name' => 10
        ],
    ];

   // public $timestamps = false ;

    protected $casts  = [
        // "meta" => 'object',
        "data" => 'array',
    ];

//    protected $appends = [
//        "name","indicative",
//        "cca2","cca3"
//    ];

    public function getRouteKeyName(){
        return "id";
    }

    public static function locales(){
        return [
            "fr" => 'fra',
            "en" => 'eng',
        ];
    }


    // RELATIONS
    public function states(){
        return $this->hasMany(State::class,"country_id");
    }

    public function addresses(){
        return $this->hasMany(Address::class,"country_id");
    }

    public function cities(){
        return $this->hasManyThrough(
            City::class, // le model/table qu'on veut retourner (cities)
            State::class, // le model/table intermédiare (states)
            'country_id', // states.country_id == countries.id
            'state_id', // cities.state_id = states.id
            'id'
        );
    }

    /** Les quartiers d'un pays (à travers les régions et les villes)
     * @return HasManyDeep
     */
    public function quarters(){
        return $this->hasManyDeep(
            Quarter::class, // le model/table qu'on veut retourner (quarters)
            [
                State::class, // 1er Model Intermédiare
                City::class // 2e Model intermédiare
            ], // Les models intermédiares ordonnés/liés hiérachiquement par rapport au model courant
            [
                'country_id', //[FK] du model courant se trouvant dans dans le 1er model intermédiare
                'state_id',  //[FK] du 1er model intermédiare se trouvant dans sur le 2e model ("towns.id_region" = "regions.id_region)
                'city_id'     //[FK] du 2e model se trouvant dans le model courant ("quarters.id_town" = "towns.id_town").
            ], // Les clés étrangères
            [
                $this->getKeyName(), //[PK] dans le model dans lequel on se trouve ("countries.id_country")
                (new State)->getKeyName(), // [PK] dans le 2e model intermédiare ("regions.id_region")
                (new City)->getKeyName()  // [PK] dans le 3e model intermédiare ("towns.id_town").
            ]

        );
    }

    public static function findByName($name){
        return Country::firstWhere("name",$name);
    }

    //*GETTERS
    //les donné recolté sur l'api
//    public function getFlagAttribute(){
//        return $this->data['cca2'];
//    }
//    public function getCca2Attribute(){
//        return strtolower($this->data['cca2']);
//    }
//    public function getCca3Attribute(){
//        return $this->data['cca3'];
//    }
//
//
//    public function getIndicativeAttribute(){
//        $idd = $this->data['idd'];
//        if (array_key_exists('root',$idd)){
//            return $idd['root'].$idd["suffixes"][0] ?? "";
//        }
//        return "";
//    }
//    public function getCurrenciesAttribute(){
//        return $this->data['currencies'];
//    }
//    public function getCurrencyAttribute(){
//        return $this->currencies[0]['symbol'];
//    }
//
//    public function getNameAttribute(){
//        $local = app()->getLocale();
//        $locales = self::locales();
//
//        if ( array_key_exists($local,$locales) and array_key_exists("translations",$this->data)){
//            $local = $locales[$local];
//            $transalations = $this->data['translations'];
//            return  array_key_exists($local,$this->data['translations'])
//                ? $transalations[$local]["common"]
//                : $this->data['name']["common"];
//        }
//
//        return "";
//
//    }
//
//    public function getNameIndicativeAttribute(){
//        return "($this->indicative) $this->name";
//    }
//
//    public function getFlagIconAttribute(){
//        $flag = strtolower($this->flag);
//        return "<i class='flag-icon flag-icon-$flag' title='$this->name'></i>";
//    }
//
//    public function getHtmlNameAttribute(){
//        return "$this->flagIcon ($this->indicative) $this->name";
//    }

}
