<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use DB;

use PDF;

class TransfertController extends Controller
{
    //
    function valider () {

        $id=request('id');	

        //$today=date('Y-m-d');
		
		DB::table('transfert')->where('id', $id)->update(
			[
				'etat' => "Validé",
			]
        );
		DB::table('ligne_transfert')->where('transfert_id', $id)->update(
			[
				'etat' => "Validé",
			]
        );

        $ligne = DB::table('ligne_transfert')->where('transfert_id', $id)->get();

        //$magx = DB::table('transfert')->where('id', $id)->first()->magasinx_id;

        //$nommagx = DB::table('magasin')->where('id', $magx)->first()->nom;
        
        $magy = DB::table('transfert')->where('id', $id)->first()->magasiny_id;
        $depot_id = DB::table('transfert')->where('id', $id)->first()->depot_id;
        $today = DB::table('transfert')->where('id', $id)->first()->date;
        $nommagy = DB::table('magasin')->where('id', $magy)->first()->nom;

        foreach($ligne as $lignes){

            $qteval = $lignes->qte;
            $desi =  DB::table('produit_vendable')->where('id', $lignes->produit_id)->first()->designation;
           
            $veriprodx =  DB::table('magasin_general')->where('produit_id', $lignes->produit_id)->where('depot_id', $depot_id)->first();

            if($veriprodx){

                $qtestocx =  DB::table('magasin_general')->where('produit_id', $lignes->produit_id)->where('depot_id', $depot_id)->get()->last()->apres;
			}else{
				$qtestocx = 0;
			}
			
            /*if ($qtestocx <= 0){
                $message = [
                    "title" => 'Erreur de stock',
                    "type" => 'error',
                    "response" => 'Aucun stock de '.$desi.' n\'est disponible dans ce dépôt !',
                ];
    
                return $message;
            } else {*/

                /*if ($qtestocx < $qteval){
                    $message = [
                        "title" => 'Erreur de stock',
                        "type" => 'error',
                        "response" => 'Stock de '.$desi.' insuffisant ! Disponible : '.$qtestocx,
                    ];
        
                    return $message;
                    
                }else{*/
            DB::table('magasin_general')->insert(
                [
                    'date' => $today,
                    'produit_id' => $lignes->produit_id,
                    'qte' => $qteval,
                    'type_operation' => 'Transfert',
                    'notes' => 'Transfert vers '.$nommagy,
                    'en_stock' => $qtestocx,
                    'apres' => ($qtestocx - $qteval),
                    'magasin_id' => $magy,
                    'depot_id' => $depot_id,
                    'transfertversmag_id' => $id,
                ]
            );

            $verif = DB::table('stock_magasin')->where('produit_id', $lignes->produit_id)->where('magasin_id', $magy)->get()->count();

            if ($verif > 0){

                $qtestoy = DB::table('stock_magasin')->where('produit_id', $lignes->produit_id)->orderbydesc('id')->take(1)->first()->stock_general;

                $smy = DB::table('stock_magasin')->where('produit_id', $lignes->produit_id)->where('magasin_id', $magy)->orderbydesc('id')->take(1)->first()->apres;

                DB::table('stock_magasin')->insert(
                    [
                        'date' => $today,
                        'magasin_id' => $magy,
                        'depot_id' => $depot_id,
                        'produit_id' => $lignes->produit_id,
                        'qte' => $qteval,
                        'pa' => $lignes->pa,
                        'montligne' => $lignes->montligne,
                        'type_operation' => 'TransfertRecu',
                        'notes' => 'Transfert reçu',
						'en_stock' => $smy,
						'apres' => ($smy + $qteval),
						'transfert_id' => $id,
                    ]
                );

            }else{

                $smy = 0;

                $qtestoy = 0;

				DB::table('stock_magasin')->insert(
                    [
                        'date' => $today,
                        'magasin_id' => $magy,
                        'depot_id' => $depot_id,
                        'produit_id' => $lignes->produit_id,
                        'qte' => $qteval,
                        'type_operation' => 'TransfertRecu',
                        'notes' => 'Transfert reçu ',
						'en_stock' => $smy,
						'apres' => ($smy + $qteval),
                        'transfert_id' => $id,
                        
                    ]
                ); 

            }
			}
			DB::table('produit_vendable')->where('id', $lignes->produit_id)->update(
                [
                    'pr' => $lignes->pa,
                ]
            );
        //}

       return redirect()->route('nouveau_transfert')->with('status', 'Transfert validé avec succès !');
       
	//}
                
   // }
   // }
		
		}

	/*
    function valider1 () {

        $id=request('id');	

		
        
        return redirect()->route('nouveau_transfert')->with('status', 'Transfert validé avec succès !');
       
	}*/


    function voirvalider ($id) {

        $tran= DB::table('transfert')->where('id',$id)->first();

        return [
            'tran' => $tran,
        ];
	}

    public function detail($id){

		if(session('user')== null) {
            return redirect('/');
        }

        $ligne=DB::table('ligne_transfert')->where('transfert_id',$id)->get();
        
		return view('transfert/detail', [

            'ligne'=> $ligne,
            
		]);
	}

	function liste(){

        if(session('user')== null) {
            return redirect('/');
        }
            $transfert = DB::table('transfert')->orderbydesc('id')->get();
           
			return view('transfert/liste',[

            'transfert' => $transfert,
            
        ]);	
    }
    function liste1(){

        if(session('user')== null) {
            return redirect('/');
        }
            $transfert = DB::table('transfert')->where('magasinx_id', session('user')->magasin_id)->get();
           
			return view('transfert/transfert_effectue',[

            'transfert' => $transfert,
            
        ]);	
    }
    

    function liste2(){

        if(session('user')== null) {
            return redirect('/');
        }
            $transfert = DB::table('transfert')->where('etat', "Validé")->where('magasiny_id', session('user')->magasin_id)->get();
           
			return view('transfert/transfert_recu',[

            'transfert' => $transfert,
            
        ]);	
    }
    

    public function transfert(){
		
        if(session('user')== null) {
            return redirect('/');
        }
       
		$produit=DB::table('produit_vendable')->orderby('designation','asc')->get();
        $magasin = DB::table('magasin')->orderBy('nom','asc')->get();
        $depot = DB::table('depot')->orderBy('nom','asc')->get();

        $transfert = DB::table('transfert')->orderbydesc('id')->get();
		
		return view('transfert/nouveau', [

			'produit'=> $produit,
            'magasin'=> $magasin,
            'transfert'=> $transfert,
            'depot'=> $depot,
			
		]);
    }
    

    function enregistrer(Request $request)
    {

        //$datetransfert= implode('-', array_reverse(explode('/', request('datetransfert'))));
        //$magasinx=request('magasinx');
		$datetransfert= date('Y-m-d');
        $magasiny=request('magasiny');
        $depot_id=request('depot_id');
        $transmag = request('item');
       
        DB::table('transfert')->insert(
            [
                'date' => $datetransfert,
                'magasiny_id' => $magasiny,
                'depot_id' => $depot_id,
                'etat' => "En cours",
                'user_id' => session('user')->id,
            ]
        );

        $idLasttranfert = DB::table('transfert')->get()->last()->id;

        //$idLastmagx = DB::table('transfert')->get()->last()->magasinx_id;

        $idLastmagy = DB::table('transfert')->get()->last()->magasiny_id;

        $idLastetat = DB::table('transfert')->get()->last()->etat;

        $idLastuser = DB::table('transfert')->get()->last()->user_id;

        $idLast= strlen($idLasttranfert);

        if ($idLast==1){
            DB::table('transfert')->where('id', $idLasttranfert)->update(
                [
                    'numero' => 'T-'.'000'.$idLasttranfert,
                ]
            );
        } elseif ($idLast==2){
    
            DB::table('transfert')->where('id', $idLasttranfert)->update(
                [
                    'numero' => 'T-'.'00'.$idLasttranfert,
                ]
            );
        } elseif ($idLast==3){
            DB::table('transfert')->where('id', $idLasttranfert)->update(
                [
                    'numero' => 'T-'.'0'.$idLasttranfert,
                ]
            );
        } else {
            DB::table('transfert')->where('id', $idLasttranfert)->update(
                [
                    'numero' => 'T-'.$idLasttranfert,
                ]
            );
        }


        $i=0;
			
	    foreach ($transmag as $key=> $transmags){

            $desi =  DB::table('produit_vendable')->where('id', $transmags[0 +$i])->first()->designation;
           
            $veriprodx =  DB::table('magasin_general')->where('produit_id', $transmags[0 +$i])->where('depot_id', $depot_id)->first();

            //if($veriprodx){

              // $qtestocx =  DB::table('magasin_general')->where('produit_id', $transmags[0 +$i])->where('depot_id', $depot_id)->get()->last()->apres;

           /*if ($qtestocx <= 0){

                DB::table('transfert')->where('id', $idLasttranfert)->delete();

                DB::table('ligne_transfert')->where('transfert_id', $idLasttranfert)->delete();

                $message = [
                    "title" => 'Erreur de stock',
                    "type" => 'error',
                    "response" => 'Aucun stock de '.$desi.' n\'est disponible dans ce dépôt !',
                ];
    
                return $message;
            } else {*/

                /*if ($qtestocx < $transmags[1 +$i]){

                    DB::table('transfert')->where('id', $idLasttranfert)->delete();

                    DB::table('ligne_transfert')->where('transfert_id', $idLasttranfert)->delete();
    
                    $message = [
                        "title" => 'Erreur de stock',
                        "type" => 'error',
                        "response" => 'Stock de '.$desi.' insuffisant ! Disponible : '.$qtestocx,
                    ];
        
                    return $message;
                    
                }else{*/


                    DB::table('ligne_transfert')->insert(
						[
								'transfert_id' => $idLasttranfert,
								'produit_id' => $transmags[0 +$i],
								'qte' => $transmags[1 +$i],
								'pa' => $transmags[2 +$i],
								'montligne' => ($transmags[2 +$i] * $transmags[1 +$i]),
								'etat' => $idLastetat,    
								//'magx' => $idLastmagx,
								'magy' => $idLastmagy, 
								'user_id' => $idLastuser,
								'date' => $datetransfert,
								
						]
					);
						$i; 

                //}

            //}

            /*}else{

                DB::table('transfert')->where('id', $idLasttranfert)->delete();

                DB::table('ligne_transfert')->where('transfert_id', $idLasttranfert)->delete();

                $message = [
                    "title" => 'Erreur de stock',
                    "type" => 'error',
                    "response" => 'Aucun stock de '.$desi.' n\'est disponible dans ce dépôt !',
                ];
    
                return $message;

            }*/

        }

        /*$message = [
            "title" => 'success',
            "type" => 'success',
            "response" => 'Opération effectué avec succes !',
        ];

        return $message; */
		return redirect()->route('nouveau_transfert')->with('status', 'Transfert enregistré avec succès !');
		

    }


    function supprimer () {

        $id=request('id');

        DB::table('ligne_transfert')->where('transfert_id', $id)->delete();
        
        DB::table('transfert')->where('id', $id)->delete();
        
        return redirect()->route('nouveau_transfert')->with('status', 'Suppression effectuée avec succès');

    }

    
    //ETAT DES TRANSFERTS
    public function index()
    {
        $magasin = DB::table('magasin')->get(); // à adapter selon ta table
        return view('transfert.etat', compact('magasin'));
    }
    public function resultat(Request $request)
    {
        $resultats = $this->getEtat($request);
        $magasin = DB::table('magasin')->get();

        return view('transfert.etat', [
            'magasin' => $magasin,
            'resultats' => $resultats,
            'request' => $request
        ]);
    }

    public function exportPdf(Request $request)
    {
        $resultats = $this->getEtat($request);
        $pdf = PDF::loadView('transfert.etatpdf', compact('resultats', 'request'));
        //return $pdf->download('etat-transfert.pdf');
        return $pdf->stream();
    }
    
    private function getEtat(Request $request)
        {
            $magasin_id = $request->magasin_id;
            $date_debut = $request->date_debut;
            $date_fin = $request->date_fin;
        
            // Quantité transférée par produit
            $transferts = DB::table('ligne_transfert')
                ->select('produit_id', DB::raw('SUM(qte) as qte_transfert'))
                ->where('etat', 'Validé')
                ->where('magy', $magasin_id)
                ->whereBetween('date', [$date_debut, $date_fin])
                ->groupBy('produit_id')
                ->get();
        
            $transfertMap = $transferts->pluck('qte_transfert', 'produit_id');
        
            // Quantité vendue par produit (ligne_vente)
            $ventes1 = DB::table('ligne_vente')
                ->select('produit_id', DB::raw('SUM(qte) as qte_vendue'))
                ->where('etat', 'Validée')
                ->whereBetween('date', [$date_debut, $date_fin])
                ->groupBy('produit_id')
                ->get();
        
            // Quantité vendue par produit (ligne_vente_client)
            $ventes2 = DB::table('ligne_vente_client')
                ->select('produit_id', DB::raw('SUM(qte) as qte_vendue'))
                ->where('etat', 'Validé')
                ->whereBetween('date', [$date_debut, $date_fin])
                ->groupBy('produit_id')
                ->get();
        
            // Fusion des ventes
            $venteMap = [];
        
            foreach ($ventes1 as $v) {
                $venteMap[$v->produit_id] = $v->qte_vendue;
            }
        
            foreach ($ventes2 as $v) {
                if (isset($venteMap[$v->produit_id])) {
                    $venteMap[$v->produit_id] += $v->qte_vendue;
                } else {
                    $venteMap[$v->produit_id] = $v->qte_vendue;
                }
            }
        
            // Liste des produits concernés (dans les transferts uniquement)
            $produits = DB::table('produit_vendable')
                ->whereIn('id', $transfertMap->keys())
                ->orderby('designation','ASC')
                ->get();
        
            // Construction du tableau final
            $resultats = [];
        
            foreach ($produits as $produit) {
                $qte_transfert = $transfertMap[$produit->id] ?? 0;
                $qte_vendue = $venteMap[$produit->id] ?? 0;
                $stock_actuel = $qte_transfert - $qte_vendue;
        
                $resultats[] = [
                    'designation' => $produit->designation,
                    'qte_transfert' => $qte_transfert,
                    'qte_vendue' => $qte_vendue,
                    'stock_actuel' => $stock_actuel,
                ];
            }
        
            return collect($resultats);
        }


}
