<?php
/**
 * Livewire Trait
 *
 * @version     1.0.0
 * @package     bplan-base/globals
 * @subpackage  Traits
 * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
 * @copyright   Copyright (C) 2025, 2026 bplan-solutions GmbH & Co. KG <https://www.bplan-solutions.de/>
 * /Δ\
 */

namespace BplanBase\Globals\Traits;


/**
 * Gemeinsame Funktionalität für Livewire-Components, die mit einem DataGrid arbeiten
 *
 * Dieser Trait übernimmt wiederkehrende Aufgaben nach jedem Render-Zyklus,
 * die sonst manuell in jeder Index-Component aufgerufen werden müssten.
 *
 * @version     1.1.0 / 2026-04-07
 * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
 */
trait WithDataGrid
{


/* +++ TRAITS +++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */


/* +++ CLASS CONSTANTS +++ ++++++++++++++++++++++++++++++++++++++++++++++++++ */


/* +++ OBJECT MEMBERS +++ +++++++++++++++++++++++++++++++++++++++++++++++++++ */


    /**
     * @var     string
     */
    public string $search = '';


/* +++ CLASS MEMBERS +++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ */


/* +++ OBJECT METHODS +++ +++++++++++++++++++++++++++++++++++++++++++++++++++ */


    /**
     * Indicates whether the current data is filtered.
     *
     * Copy this method into your component and customize it to suit your needs if
     * additional filters are used in the grid alongside the standard search.
     *
     * @return      bool
     *
     * @version     1.0.0 / 2026-04-06
     * @author      Emilio Cannarozzo <emilio.cannarozzo@bplan-solutions.de>
     * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
     */
    private function _hasActiveFilters(): bool
    {
        return !empty($this->search);

    } // _hasActiveFilters()


    /**
     * Prepares an extended Query
     *
     * Implement this method in your component if the default search does not meet
     * your requirements.
     *
     * @return 	    Builder|null
     *
     * @version     1.0.0 / 2026-04-06
     * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
     */
    protected function _getQuery()
    {
        $ExtendQuery = null;

        $this->search = trim($this->search);

        if (!empty($this->search)) {
            /*
            **  Create a QueryBuilder with filter parameters. */
            $ExtendQuery = $this->_modelClass::query();

            $method = 'whereLike';

            foreach ($this->_searchFields as $field) {
                $ExtendQuery->{$method}($field, '%'.strtolower($this->search).'%');
                $method = 'orWhereLike';
            }
        }
        return $ExtendQuery;

    } // _getQuery()


    /**
     *
     * @return      void
     *
     * @version     1.1.0 / 2026-04-07
     * @author      Emilio Cannarozzo <emilio.cannarozzo@bplan-solutions.de>
     * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
     */
    public function init(): void
    {
        $this->skipRender();

    } // init()


    /**
     *
     * @return      void
     *
     * @version     1.0.0 / 2026-04-06
     * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
     */
    public function mountWithDataGrid(): void
    {
        \Registry::put('env.page-title', __($this->_gridLocaleFile.'.page.title'));

    } // mountWithDataGrid()


    /**
     * Wird von Livewire nach jedem Render-Zyklus automatisch aufgerufen
     *
     * Initialisiert TippyJS neu, da nach einem Re-Render neue DOM-Elemente
     * mit Tooltip-Attributen vorhanden sein können.
     *
     * @return      void
     *
     * @version     1.0.0 / 2026-04-06
     * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
     */
    public function rendered(): void
    {
        $this->dispatch('init-tippyjs');

    } // rendered()


/* +++ CLASS METHODS +++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ */


} // trait WithDataGrid {}
