<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Role;
use ROLE as CONSTANT_ROLE;

class Structure extends Model
{
    use HasFactory;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'nom',
        'description',
        'adresse',
        'cp',
        'ville',
        'longitude',
        'latitude',
        'champ_referentiel',
        'active',
        'logo',
        'consolidation_id',
    ];

    /**
     * Permet de retourner un tableau avec le nombre de d'utilisateur par rôle
     * @return array
     */
    public function count_users_by_role()
    {
        return [
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::ADMINISTRATEUR_STRUCTURE] => User::role(CONSTANT_ROLE::ADMINISTRATEUR_STRUCTURE . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::ACHETEUR] => User::role(CONSTANT_ROLE::ACHETEUR . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::CONTROLEUR_GESTION] => User::role(CONSTANT_ROLE::CONTROLEUR_GESTION . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::DIRECTEUR] => User::role(CONSTANT_ROLE::DIRECTEUR . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::DIRECTEUR_ACHAT] => User::role(CONSTANT_ROLE::DIRECTEUR_ACHAT . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::RESPONSABLE_ACHAT] => User::role(CONSTANT_ROLE::RESPONSABLE_ACHAT . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::CHEF_PROJET] => User::role(CONSTANT_ROLE::CHEF_PROJET . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::RESPONSABLE_PERFORMANCE_ARS] => User::role(CONSTANT_ROLE::RESPONSABLE_PERFORMANCE_ARS . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::EQUIPE_PROJET] => User::role(CONSTANT_ROLE::EQUIPE_PROJET . '_' . $this->id)->count(),
            CONSTANT_ROLE::ROLES_FORMATTED[CONSTANT_ROLE::EXPERT] => User::role(CONSTANT_ROLE::EXPERT . '_' . $this->id)->count()
        ];
    }

    /**
     * Permet de retourner les roles d'une structure
     * Les noms des roles sont suffixés par l'id de la structure
     * @return mixed
     */
    public static function get_roles($structure_id)
    {
        return Role::select('id', DB::raw('SUBSTRING(name, 1, LENGTH(name) - INSTR(REVERSE(name), \'_\')) AS name'), 'guard_name')->where('name', 'LIKE', '%_' . $structure_id)->get();
    }

    /**
     * Retourne la consolidation de la structure
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function consolidation()
    {
        return $this->belongsTo(Consolidation::class);
    }

    public function administrateurs()
    {
        $administrateurs = User::role(CONSTANT_ROLE::ADMINISTRATEUR_STRUCTURE . '_' . $this->id)
            ->where('structure_id', $this->id)->pluck('email')->toArray();

        return implode(', ', $administrateurs);
    }

    public function csvClientEntetes()
    {
        return $this->hasMany(CSVClientEntetes::class);
    }

    public function csvDonneesClient()
    {
        return $this->hasMany(CSVDonneesClient::class);
    }
}
