<?php

namespace App\Models;

use CodeIgniter\Model;

class Products extends Model
{
    protected $table = 'products';
    protected $primaryKey = 'id';
    protected $allowedFields = ['name', 'sku', 'price', 'product_sold', 'qty', 'image', 'description', 'numero_de_moteur', 'marque', 'chasis', 'store_id', 'availability', 'is_piece', 'prix_vente', 'date_arivage', 'puissance', 'cler', 'categorie_id', 'etats','type', 'infoManquekit', 'info', 'infoManque'];

    /**
     * ✅ NOUVELLE MÉTHODE : Récupérer les produits selon le rôle et le store de l'utilisateur
     * @param int|null $id
     * @return array|object|null
     */
    public function getProductDataByRole(int $id = null)
    {
        $session = session();
        $user = $session->get('user');
        
        // Vérifier si l'utilisateur est admin (Conseil ou Direction)
        $isAdmin = in_array($user['group_name'], ['Conseil', 'Direction']);
        
        $builder = $this->where('is_piece', 0)
                        ->where('product_sold', 0);
        
        // ✅ Si pas admin ET a un store_id valide, filtrer par son magasin
        if (!$isAdmin) {
            // ✅ Si l'utilisateur n'a pas de store_id (NULL ou 0), ne retourner aucun produit
            if (empty($user['store_id']) || $user['store_id'] == 0) {
                // Retourner une requête impossible pour avoir 0 résultats
                $builder->where('id', -1);
            } else {
                // Filtrer par le store_id de l'utilisateur
                $builder->where('store_id', $user['store_id']);
            }
        }
        
        // Si un ID spécifique est demandé
        if ($id) {
            return $builder->where('id', $id)->first();
        }
        
        return $builder->orderBy('id', 'DESC')->findAll();
    }

    /**
     * get the brand data
     * @param int $id
     * @return array|object|null
     */
    public function getProductData(int $id = null)
    {
        if ($id) {
            return $this->where('id', $id)->first();
        }

        return $this->where([
            'is_piece' => 0,
            'product_sold' => 0
        ])->orderBy('id', 'DESC')->findAll();
    }

    public function getProductData2(int $id)
    {
        $builder = $this->where('is_piece', 0)
            ->where('product_sold', 0)
            ->where('store_id', $id);

        return $builder->join('brands', 'brands.id = products.marque')
            ->orderBy('products.id', 'DESC')
            ->select('brands.name as brand_name,COUNT( products.id) as total_product, products.store_id as store_id,products.*')
            ->groupBy('store_id')
            ->findAll();
    }

    public function getProductData3(int $id)
    {
        if ($id == 0) {
            return $this->where('is_piece', 0)->orderBy('id', 'DESC')->findAll();
        }

        return $this->where('is_piece', 0)->where('product_sold', 0)->where('store_id', $id)->orderBy('id', 'DESC')->findAll();
    }

    public function getProductDataStore(int $store_id, bool $excludeAvance = true, int $currentProductId = null)
    {
        $builder = $this->where('is_piece', 0)
                        ->where('product_sold', 0)
                        ->where('availability', 1)
                        ->where('store_id', $store_id);
    
        if ($excludeAvance) {
            $db = \Config\Database::connect();
            $subQuery = $db->table('avances')
                ->select('product_id')
                ->where('active', 1)
                ->where('is_order', 0)
                ->getCompiledSelect();
    
            $builder->where("id NOT IN ($subQuery)", null, false);
        }
    
        if ($currentProductId) {
            $builder->orWhere('id', $currentProductId);
        }
    
        return $builder->orderBy('id', 'DESC')->findAll();
    }

    public function getActiveProductData()
    {
        return $this->where('is_piece', 0)->orderBy('id', 'DESC')->findAll();
    }

    public function assignToStore($productid = null, $storeid = null)
    {
        if (!is_null($productid) && !is_null($storeid)) {
            $this->db->table('products')
                ->where('id', $productid)
                ->update(['store_id' => $storeid]);

            return true;
        }

        return false;
    }

    public function create(array $data)
    {
        return $this->insert($data) ? true : false;
    }

    public function updateProduct(array $data, int $id)
    {
        return $this->update($id, $data) ? true : false;
    }

    public function remove(int $id)
    {
        return $this->delete($id) ? true : false;
    }

    public function countTotalProducts()
    {
        $db = \Config\Database::connect();
        
        $subQuery = $db->table('avances')
            ->select('product_id')
            ->where('active', 1)
            ->where('is_order', 0)
            ->getCompiledSelect();
        
        return $this->where('is_piece', 0)
                    ->where('product_sold', 0)
                    ->where("id NOT IN ($subQuery)", null, false)
                    ->countAllResults();
    }

    public function countAllProductsIncludingSold()
    {
        return $this->countAll();
    }

    public function getTotalProductPriceByIds(array $productIds)
    {
        try {
            $total = 0.0;

            foreach ($productIds as $id) {
                $row = $this->select('price')
                    ->where('id', $id)
                    ->first();

                if ($row && isset($row['price'])) {
                    $total += (float) $row['price'];
                }
            }

            return $total;
        } catch (\Throwable $th) {
            return false;
        }
    }

    public function getProductNameById(int $id): ?string
    {
        $product = $this->where('id', $id)->first();

        if ($product && isset($product['name'])) {
            return $product['name'];
        }

        return null;
    }

    /**
 * Compter les produits par store selon le rôle de l'utilisateur
 * @return int
 */
public function countProductsByUserStore()
{
    $session = session();
    $user = $session->get('user');
    
    // Vérifier si l'utilisateur est admin
    $isAdmin = in_array($user['group_name'], ['DAF', 'Direction']);
    
    $db = \Config\Database::connect();
    
    // Sous-requête pour exclure les produits en avance
    $subQuery = $db->table('avances')
        ->select('product_id')
        ->where('active', 1)
        ->where('is_order', 0)
        ->getCompiledSelect();
    
    $builder = $this->where('is_piece', 0)
                    ->where('product_sold', 0)
                    ->where("id NOT IN ($subQuery)", null, false);
    
    // Si pas admin ET a un store_id valide, filtrer par son magasin
    if (!$isAdmin && !empty($user['store_id']) && $user['store_id'] != 0) {
        $builder->where('store_id', $user['store_id']);
    } elseif (!$isAdmin) {
        // Utilisateur sans store = 0 produits
        return 0;
    }
    
    return $builder->countAllResults();
}
}