<?php

namespace App\Controllers\Admin;

use App\Models\Magento\AlertesCatalogModel;

class AlertesCatalog extends \App\Controllers\BaseController
{
    public function produitsSansPmvc()
    {
        $model = new AlertesCatalogModel();

        $dateDebut = $this->request->getGet('date_debut') ?: date('Y-m-d', strtotime('-30 days'));
        $dateFin   = $this->request->getGet('date_fin') ?: date('Y-m-d');

        try {
            $produits = $this->applyExclusions($model->getProduitsSansPmvc($dateDebut, $dateFin), 'alertes_catalog_sans_pmvc', 'entity_id');
            $produitsRecents = $this->applyExclusions($model->getProduitsSansPmvcCreesApres($dateDebut, $dateFin, '2026-03-05'), 'alertes_catalog_sans_pmvc_recents', 'entity_id');
        } catch (\Throwable $e) {
            log_message('error', '[AlertesCatalog::produitsSansPmvc] ' . $e->getMessage());
            return $this->response->setJSON([
                'error'   => $e->getMessage(),
                'file'    => $e->getFile(),
                'line'    => $e->getLine(),
                'trace'   => $e->getTraceAsString(),
            ]);
        }

        $data = [
            'produits'  => $produits,
            'produitsRecents' => $produitsRecents,
            'dateDebut' => $dateDebut,
            'dateFin'   => $dateFin,
            'createdFrom' => '2026-03-05',
            'title'     => 'Produits sans PMVC',
        ];

        return view('admin/alertes_catalog/produits_sans_pmvc', $data);
    }

    public function produitsSansCodeBarres()
    {
        $model = new AlertesCatalogModel();

        $dateDebut = $this->request->getGet('date_debut') ?: date('Y-m-d', strtotime('-30 days'));
        $dateFin   = $this->request->getGet('date_fin') ?: date('Y-m-d');

        try {
            $produits = $this->applyExclusions($model->getProduitsSansCodeBarres($dateDebut, $dateFin), 'alertes_catalog_sans_code_barres', 'entity_id');
            $produitsRecents = $this->applyExclusions($model->getProduitsSansCodeBarresCreesApres($dateDebut, $dateFin, '2026-03-05'), 'alertes_catalog_sans_code_barres_recents', 'entity_id');
        } catch (\Throwable $e) {
            log_message('error', '[AlertesCatalog::produitsSansCodeBarres] ' . $e->getMessage());
            return $this->response->setJSON([
                'error'   => $e->getMessage(),
                'file'    => $e->getFile(),
                'line'    => $e->getLine(),
                'trace'   => $e->getTraceAsString(),
            ]);
        }

        $data = [
            'produits'  => $produits,
            'produitsRecents' => $produitsRecents,
            'dateDebut' => $dateDebut,
            'dateFin'   => $dateFin,
            'createdFrom' => '2026-03-05',
            'title'     => 'Produits sans code-barres',
        ];

        return view('admin/alertes_catalog/produits_sans_code_barres', $data);
    }

    public function verifPromos()
    {
        $model = new AlertesCatalogModel();

        try {
            $promoNomSansOui = $this->applyExclusions($model->getProduitsPromoNomSansAttributOui(), 'alertes_catalog_promo_nom_sans_oui', 'entity_id');
            $promoOuiSansNom = $this->applyExclusions($model->getProduitsPromoAttributOuiSansNomPromo(), 'alertes_catalog_promo_oui_sans_nom', 'entity_id');
            $enPromoOui = $this->applyExclusions($model->getProduitsEnPromoOui(), 'alertes_catalog_en_promo_oui', 'entity_id');
        } catch (\Throwable $e) {
            log_message('error', '[AlertesCatalog::verifPromos] ' . $e->getMessage());
            return $this->response->setJSON([
                'error'   => $e->getMessage(),
                'file'    => $e->getFile(),
                'line'    => $e->getLine(),
                'trace'   => $e->getTraceAsString(),
            ]);
        }

        $data = [
            'promoNomSansOui' => $promoNomSansOui,
            'promoOuiSansNom' => $promoOuiSansNom,
            'enPromoOui' => $enPromoOui,
            'title' => 'Vérif promos',
        ];

        return view('admin/alertes_catalog/verif_promos', $data);
    }

    public function stockPromos()
    {
        $model = new AlertesCatalogModel();

        try {
            $produits = $this->applyExclusions($model->getStockPromos(), 'alertes_catalog_stock_promos', 'entity_id');
        } catch (\Throwable $e) {
            log_message('error', '[AlertesCatalog::stockPromos] ' . $e->getMessage());
            return $this->response->setJSON([
                'error'   => $e->getMessage(),
                'file'    => $e->getFile(),
                'line'    => $e->getLine(),
                'trace'   => $e->getTraceAsString(),
            ]);
        }

        $ruleStats = [];
        foreach ($produits as $produit) {
            $ruleId = $produit['rule_id'];
            if (!isset($ruleStats[$ruleId])) {
                $ruleStats[$ruleId] = [
                    'rule_id' => $ruleId,
                    'rule_name' => $produit['rule_name'],
                    'total' => 0,
                    'rupture' => 0,
                    'produits' => [],
                ];
            }
            $ruleStats[$ruleId]['total']++;
            $ruleStats[$ruleId]['produits'][] = $produit;
            if (($produit['availability'] ?? '') !== 'En stock') {
                $ruleStats[$ruleId]['rupture']++;
            }
        }

        foreach ($ruleStats as &$stat) {
            usort($stat['produits'], static function ($a, $b) {
                $aRupture = ($a['availability'] ?? '') !== 'En stock';
                $bRupture = ($b['availability'] ?? '') !== 'En stock';
                if ($aRupture !== $bRupture) {
                    return $aRupture ? -1 : 1;
                }
                return ((float) ($a['available_qty'] ?? 0)) <=> ((float) ($b['available_qty'] ?? 0));
            });
        }
        unset($stat);

        usort($ruleStats, static function ($a, $b) {
            return $b['rupture'] <=> $a['rupture'];
        });

        $rulesAllOutOfStock = [];
        $rulesPartialOutOfStock = [];
        foreach ($ruleStats as $stat) {
            if ($stat['rupture'] === $stat['total']) {
                $rulesAllOutOfStock[] = $stat;
            } elseif ($stat['rupture'] > 0) {
                $rulesPartialOutOfStock[] = $stat;
            }
        }

        $data = [
            'produits' => $produits,
            'rulesAllOutOfStock' => $rulesAllOutOfStock,
            'rulesPartialOutOfStock' => $rulesPartialOutOfStock,
            'title' => 'Stock Promos',
        ];

        return view('admin/alertes_catalog/stock_promos', $data);
    }

    public function suggestionsDestockage()
    {
        $model = new AlertesCatalogModel();

        try {
            $produits = $this->applyExclusions($model->getDestockageSuggestions(50), 'alertes_catalog_suggestions_destockage', 'entity_id');
        } catch (\Throwable $e) {
            log_message('error', '[AlertesCatalog::suggestionsDestockage] ' . $e->getMessage());
            return $this->response->setJSON([
                'error'   => $e->getMessage(),
                'file'    => $e->getFile(),
                'line'    => $e->getLine(),
                'trace'   => $e->getTraceAsString(),
            ]);
        }

        $totalStockValue = 0.0;
        foreach ($produits as $produit) {
            $totalStockValue += (float)($produit['stock_value'] ?? 0);
        }

        return view('admin/alertes_catalog/suggestions_destockage', [
            'produits' => $produits,
            'totalStockValue' => $totalStockValue,
            'title' => 'Suggestions déstockage',
        ]);
    }
}
