<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Hash;

class Dispositivo extends \App\Models\AbstractModels\AbstractDispositivo
{
    const STAMPANTE = 'stampante';  // stampante DI CASSA O DI CUCINA
    const CASSA = 'cassa';  // cassa di vendita
    const KIOSK = 'kiosk';  // kiosk di vendita
    const CAMERIERE = 'cameriere';  // cameriere di vendita
    const MONITOR = 'monitor';  // monitor PER CHIAMATA PIATTI
    const OPERATORE = 'operatore';  // operatore di chiamata piatti/ordini
    const BACHECA = 'bacheca';  // bacheca di vendita/PUBBLICITà
    const SALTACODA = 'saltacoda';  // permette agli utent non autenticati di creare un ordine temporaneo

public static function getTipoDispositivo(){

    return collect([
        self::STAMPANTE => [
            'label' => 'Stampante',
            'icon' => 'bx bx-printer',
            'value' => self::STAMPANTE,
        ],
        self::CASSA => [
            'label' => 'Cassa',
            'icon' => 'bx bx-store',
            'value' => self::CASSA,
        ],
        self::KIOSK => [
            'label' => 'Kiosk',
            'icon' => 'bx bx-laptop',
            'value' => self::KIOSK,
        ],
        self::CAMERIERE => [
            'label' => 'Cameriere',
            'icon' => 'bx bx-user',
            'value' => self::CAMERIERE,
        ],
        self::MONITOR => [
            'label' => 'Monitor',
            'icon' => 'bx bx-tv',
            'value' => self::MONITOR,
        ],
        self::BACHECA => [
            'label' => 'Bacheca',
            'icon' => 'bx bx-book',
            'value' => self::BACHECA,
        ],
        self::OPERATORE => [
            'label' => 'Operatore',
            'icon' => 'bx bx-user',
            'value' => self::OPERATORE,
        ],
        self::SALTACODA => [
            'label' => 'Saltacoda',
            'icon' => 'bx bx-user',
            'value' => self::SALTACODA,
        ],
    ]);
}

public static function getTipoDispositivoLabel($tipo){
    return $this->getTipoDispositivo()[$tipo];
}

public static function getTipoPuntiVendita(){
    return self::getTipoDispositivo()
    ->whereIn('value', [self::KIOSK, self::CASSA , self::CAMERIERE])
    ->pluck('value', 'label');
}

public function occupato() {
    return !empty($this->url_stampante);
}

public function is_remoto() {
    return $this->url_stampante !== null && strpos($this->url_stampante, 'is_remoto::') === 0;
}

public function url_stampante_remota(){
    if ($this->is_remoto()) {
        $parts = explode('::', $this->url_stampante, 2);
        return $parts[1] ?? null;
    }
    return false;
}

public static function cassa(){
    return self::where('tipo', self::CASSA);
}

public static function select2_stampante(){
    // Se vuoi completare le stampanti anche includendo la loro affiliazione a un endpoint (se presente),
    // puoi modificare così:
    return self::where('tipo', self::STAMPANTE)
        ->where('is_attivo', true)
        ->where('attivita_id', session('attivita_attuale'))
        ->get()
        ->mapWithKeys(function($stampante) {
            return [$stampante->nome . " (EP: ".($stampante->endpoint()?->label ?? 'N/A').")" => $stampante->id];
        });
}

public function stampante_dispositivo(){
    return Dispositivo::find($this->url_stampante);
}

public static function findByBindingCookieToken(?string $cookieToken): ?self
{
    if (!$cookieToken) {
        return null;
    }

        return self::query()
            ->whereNotNull('binding_token')
            ->where('binding_token', $cookieToken)
            ->where('occupato', true)
            ->first();
}

///EX
// public static function findByBindingCookieToken(?string $cookieToken): ?self
// {
//     if (!$cookieToken) {
//         return null;
//     }

//     return self::query()
//         ->whereNotNull('binding_token')
//         ->get()
//         ->first(function (self $dispositivo) use ($cookieToken) {
//             return Hash::check((string) $dispositivo->binding_token, $cookieToken);
//         });
// }
///EX

public function cucine()
{
    return $this->belongsToMany('\App\Models\Cucina', 'dispositivo_has_cucina', 'dispositivo_id', 'cucina_id');
}
};
