<?php

namespace App\Models;

use CodeIgniter\Model;

class Assignation extends Model
{
    /**
     * table users name
     * @var string
     */
    protected $table = 'affect_product';
    protected $primaryKey = 'id';
    protected $allowedFields = ['product_id', 'store_id', 'qty'];

    public function affecterProduits($produitId, $quantite, $pointDeVenteId)
{
    // Charger les modèles
    $produitModel = new Products();
    $pointDeVenteModel = new Stores();
    
    // Récupérer le produit avec son stock et son point de vente principal
    $produit = $produitModel->find($produitId);
    
    // Récupérer le point de vente principal
    $pointDeVentePrincipal = $pointDeVenteModel->find($produit['store_id']);
    
    // Vérifier que le stock du produit principal est suffisant
    if ($produit['qty'] < $quantite) {
        return 'Stock insuffisant dans le point de vente principal';
    }
    
    // Commencer une transaction pour s'assurer de l'intégrité des données
    $db = \Config\Database::connect();
    $db->transStart();
    
    // 1. Réduire le stock du point de vente principal
    $newStockPrincipal = $pointDeVentePrincipal['stock'] - $quantite;
    $pointDeVenteModel->update($produit['point_vente_principal_id'], ['stock' => $newStockPrincipal]);
    
    // 2. Augmenter le stock du point de vente cible
    $pointDeVente = $pointDeVenteModel->find($pointDeVenteId);
    $newStockVente = $pointDeVente['stock'] + $quantite;
    $pointDeVenteModel->update($pointDeVenteId, ['stock' => $newStockVente]);
    
    // 3. Ajouter un enregistrement dans la table d'affectation
    $affectationModel = new AffectationProduitModel();
    $affectationModel->insert([
        'produit_id' => $produitId,
        'point_vente_id' => $pointDeVenteId,
        'quantite' => $quantite,
        'date_affectation' => date('Y-m-d H:i:s')
    ]);
    
    // Si tout s'est bien passé, valider la transaction
    $db->transComplete();
    
    // Vérifier si la transaction a réussi
    if ($db->transStatus() === FALSE) {
        return 'Une erreur est survenue lors de l\'affectation';
    }
    
    return 'Affectation réussie';
}

    public function principalAffect(array $data)
    {
        return $this->insert($data);
    }

}