<?php

namespace App\Http\Controllers;

use App\Models\Categorie;
use App\Models\Movimenti;
use App\Models\tag;
use App\Models\Task;
use App\Models\Avviso;
use App\Models\Conto;
// use App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Rap2hpoutre\FastExcel\FastExcel;
use Illuminate\Support\Facades\Storage;
use DateTime;


class MovimentiController extends Controller
{
    public $map;

    // Gestione dei movimenti
    public static function newMovimenti() {
        $categorie=Categorie::list();   // TODO: da risolvere con jquery nella pagina blade conti.movimenti.list
        $tags=tag::getList();           // TODO: da risolvere con jquery nella pagina blade conti.movimenti.list (spiegazione su https://library.webschool.com/lezione/guida-jquery-recuperare-dati-da-php-con-json-2564.html )
        return view('conti.movimenti.new',[
            'categorie'=>$categorie,
            'tags'=>$tags,
        ]);
    }

    public static function listMovimenti(){
        $categorie=Categorie::list();
        $tags=tag::getList();
        $contos=Conto::all();
       /* Query per visualizzare anche il totale dei documenti presenti per il record */
        $movimenti=Movimenti::getList();

        //dd($movimenti);
        return view('conti.movimenti.list',[
            'categorie'=>$categorie,
            'movimenti'=>$movimenti,
            'contos'=>$contos,
            'tags'=>$tags
        ]);
    }

    public static function dashboard()
    {
        /*$bilancio=Movimenti::getSaldo(date('Y'));*/
        $entrate=Movimenti::getEntrate(date('Y'));
        $uscite=Movimenti::getUscite(date('Y'));
        $saldo=Movimenti::getSaldoTot();
        $mieiTasks=Task::getTaskAssignedToUser(Auth::id());
        // $TasksAssegnati=Task::getTaskAssignedByUser(Auth::id());
       // $avvisi=Avviso::getAvvisi();
       $avvisi=Avviso::getActualAvvisi();

        return view('layouts.dashboard',[
            'entrate'=>$entrate,
            'uscite'=>$uscite,
            'saldo'=>$saldo,
            'mieitask' => $mieiTasks,
           // 'assegnati' => $TasksAssegnati,
           'avvisi'=>$avvisi,
        ]);
    }

    public static function insMovimentiSpesa(Request $request)
    {
        // dd($request);
        $validated=$request->validate([
            'mov_data'=>'required',
            'mov_importo'=>'required | numeric' ,

        ]);
        Movimenti::insSpesa($request);
        $mov=Movimenti::getList();
        $categorie=Categorie::listSpesa();
        $tags=tag::getList();
        return view('conti.movimenti.list',
            [
                'categorie'=> $categorie,
                'movimenti'=> $mov,
                'tags'=>$tags,
            ]);

           /* return dd($mov);*/
    }
    public static function insMovimentiEntrata(Request $request)
    {
        $validated=$request->validate([
            'mov_data'=>'required',
            'mov_importo'=>'required | numeric' ,

        ]);
        Movimenti::insEntrata($request);
        $mov=Movimenti::getList();
        $categorie=Categorie::listEntrata();
        $tags=tag::getList();
        return view('conti.movimenti.list',
            [
                'categorie'=> $categorie,
                'movimenti'=> $mov,
                'tags'=>$tags,
            ]);

        /* return dd($mov);*/
    }
    public function exportMovimenti()
    {
        $movimenti = Movimenti::export();
        foreach ($movimenti as $movimento)
        {
            $lista[]=[
                'Data'=> date_format(date_create($movimento->Data),'d/m/Y'),
                'Categoria'=>$movimento->Categoria,
                'Tag'=>$movimento->Tag,
                'Descrizione'=>$movimento->Descrizione,
                'Importo_dare'=>$movimento->Importo_dare,
                'Importo_avere'=>$movimento->Importo_avere,
                // 'Conto'=>$movimento->Conto,
            ];
        }
            return (new FastExcel($lista))->download('movimenti_al_'.date('d-m-Y').'.xls');
            // return dd($movimenti);
    }

    public function resocontoMovimenti(Request $request)
    {
        if(!$request['Year'])
        {
            $year=date('Y');
        }
        else {
            $year=$request['Year'];
        }

        if (!$request['Month'])
        {
            $month=date('m');
        }
        else {
            $month=$request['Month'];
        }

        $reportSpesa = Movimenti::reportSpesa($year, $month);
        $reportEntrate = Movimenti::reportEntrate($year,$month);

        return view('components.charts',[
            'dataSpesa'=>$reportSpesa,
            'dataEntrate'=>$reportEntrate,
        ]);
    }

    public function updatePostMovimenti(Request $request)
    {
        Movimenti::updateMovimenti($request);
       // return redirect()->back();
       return view('conti.movimenti.list',
           [
               'movimenti'=> Movimenti::getList(),
           ]);
    }

    public function deleteMovimenti(Request $request)
    {
        Movimenti::deleteMovimento($request['id']);
        return redirect('/admin/movimenti');

    }

    public function girocontoPost(Request $request)
    {
        Movimenti::giroconto($request);
        return redirect('/admin/movimenti');
    }

    public function giroconto()
    {
        $categorie=Categorie::list();
        return view('conti.giroconto.form',[
            'categories'=>$categorie,
            'contos'=>Conto::all(),

        ]);
    }

    public function listMovPerCateg(Request $request)
    {
        if($request['year'])
        {
            $anno=$request['year'];
        }
        else
        {
            $anno=date('Y');
        }
        $mov=Movimenti::listByCatMonth($request['month'], $request['cat'],$anno);
        return view('conti.movimenti.list',
            [
                'movimenti'=> $mov,
            ]);
    }

    public function listMovByCat(Request $request)
    {
        $mov=Movimenti::listByCategory($request['cat']);
        return view('conti.movimenti.list',
            [
                'movimenti'=> $mov,
            ]);
    }

    public function reportCategorieAnno($anno = 0)
    {
        if ($anno <= 1970)
        {
            $anno = date('Y');
        }

        $mesi=['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'];
        $categorie=Categorie::list();

        foreach ($categorie as $categoria)
        {
            $id=$categoria->id;
            $ncategoria=$categoria->cat_name;
            for ($i=1;$i<=12;$i++)
            {
                $importo_dare = DB::table('movimentis')
                ->whereMonth('mov_data', '=', $i)
                ->whereYear('mov_data', '=', $anno)
                ->where('mov_fk_categoria', '=', $id)
                ->sum('mov_importo_dare');

                $importo_avere = DB::table('movimentis')
                ->whereMonth('mov_data', '=', $i)
                ->whereYear('mov_data', '=', $anno)
                ->where('mov_fk_categoria', '=', $id)
                ->sum('mov_importo_avere');

                $movrow = $importo_avere - $importo_dare;

                    $coll[]=$movrow;
                    $collx[]=$movrow;
               }

            $totale[]=array_sum($collx);
            unset($collx);
        }
         /*dd($totale);*/
        $anni=Movimenti::getYearsFromMovimenti();
       // dd($anni);
        return view('conti.report.catanno',[
                'categorie'=>$categorie,
                'mesi'=>$mesi,
                'matrice'=>array_chunk($coll, 12),
                'totale'=>$totale,
                'anno'=>$anno,
                'sel_anni'=>$anni,
        ]);
    }

    public function reportCategorieAnnoXLS($anno = 0)
    {
        if ($anno <= 1970)
        {
            $anno = date('Y');
        }

        $intestazione=['Categoria','Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'];
        $categorie=DB::table('categories')->orderBy('cat_name')->get();

        /*foreach ($categorie as $categoria)
        {
            $id=$categoria->id;
            $ncategoria=$categoria->cat_name;
            for ($i=1;$i<=12;$i++)
            {
                $movrow=DB::table('movimentis')
                ->whereMonth('mov_data','=',$i)
                ->whereYear('mov_data','=',$anno)
                ->where('mov_fk_categoria','=',$id)
                ->sum('mov_importo');
                $coll[] = $movrow;

            }

            $row[]=array_combine($intestazione,array_merge(array($ncategoria),$coll));
            unset($coll);
        }*/
            foreach ($categorie as $categoria)
        {
            $id=$categoria->id;
            $ncategoria=$categoria->cat_name;
            for ($i=1;$i<=12;$i++)
            {
                $importo_dare = DB::table('movimentis')
                ->whereMonth('mov_data', '=', $i)
                ->whereYear('mov_data', '=', $anno)
                ->where('mov_fk_categoria', '=', $id)
                ->sum('mov_importo_dare');

                $importo_avere = DB::table('movimentis')
                ->whereMonth('mov_data', '=', $i)
                ->whereYear('mov_data', '=', $anno)
                ->where('mov_fk_categoria', '=', $id)
                ->sum('mov_importo_avere');

                $movrow = $importo_avere - $importo_dare;

                    $coll[]=$movrow;
                    $collx[]=$movrow;
               }

            $totale[]=array_sum($collx);
            $row[]=array_combine($intestazione,array_merge(array($ncategoria),$collx));
            unset($collx);
        }
     return (new FastExcel($row))->download('report_al_'.date('d-m-Y').'.xls');
    }

    public function filterByTag(Request $tag)
    {
        $mov=Movimenti::getByTag($tag['tag']);
        return view('conti.movimenti.list',
            [
                'movimenti'=> $mov,
            ]);
    }


    public function apiList()
    {
        $movments = Movimenti::getList();
        return json_encode($movments);
    }

    private function dateFormat($type,$string)
    {
        if($type)
        {
            list($year,$month,$day) = explode('-',$string);
            return $day.'/'.$month.'/'.$year;
        } else {
            list($day,$month,$year) =explode('/',$string);
            return $year.'-'.$month.'-'.$day;
        }
    }

  /*  public function importEC_ING(Request $request)
    {
        if ($request->hasFile('filename'))
        {
            $filename=$request->file('filename')->store();
             Movimenti::importEstrattoIng($filename);

            return redirect(Route('movimenti'));
        }
        else {
            return 'Nessun File trovato';

        }
    }*/

   /* public function importEC_CR(Request $request)
    {
        if ($request->hasFile('filename'))
        {
            $filename=$request->file('filename')->store();
            Movimenti::importEstrattoCR($filename);

            return redirect(Route('movimenti'));
        }
        else {
            return 'Nessun File trovato';

        }
    }*/

    public function importGenericCsv(Request $request)
    {
        if ($request->hasFile('filename'))
        {
            $filename=$request->file('filename')->store();
            $csv_headers=Movimenti::retrieveHeaders($filename);
            $db_fields=Movimenti::getDbFields();

            return view('conti.importGeneric',['csv'=>$csv_headers,'db'=>$db_fields,'filename'=>$filename]);
        }

        else {
            return 'Nessun File trovato';
        }
    }

    public function importmappedCsv(Request $request)
    {
        $this->prepareMapping($request['mapping']);
        $filename = Storage::path($request->filename);

        (new FastExcel)->configureCsv(';')->import($filename, function($line) {
            $data = $this->mapCsvLineToDb($line);
           // dd($data);
            if (isset($data['mov_data'])) {
               Movimenti::importNoDuplicate($data);
                //Movimenti::create($data);
            }
        });

        return redirect(Route('movimenti'));
    }

    /**
     * Prepara la mappatura tra i campi CSV e i campi DB
     */
    private function prepareMapping($mapping)
    {
        foreach ($mapping as $key => $value) {
            if ($value != null) {
                $this->map[$key] = $value;
            }
        }
    }

    /**
     * Mappa una riga del CSV ai campi del database
     */
    private function mapCsvLineToDb($line)
    {
        if (isset($line[$this->map['mov_data']])) {
           $data = [
            'mov_data' => $this->parseDate($line[$this->map['mov_data']]),
            'mov_descrizione' => $line[$this->map['mov_descrizione']] ?? null,
            'mov_importo_dare' => Movimenti::cleanImporto($line[$this->map['mov_importo_dare']]?? null) ,
            'mov_importo_avere' => Movimenti::cleanImporto($line[$this->map['mov_importo_avere']] ?? null),
            'mov_fk_categoria' => Movimenti::setCategoriesFromCsv($line[$this->map['mov_descrizione']] ?? ''),
            'mov_fk_tags' => 1,
            'mov_inserito_da' => Auth::id(),
            'conto_id_da' => 1,
            'conto_id_a' => 1,
        ];
        return $data;
        }
        return null; // Se non c'è la data, non importa la riga


    }

    /**
     * Converte la data dal formato d/m/Y a Y-m-d
     */
    private function parseDate($dateString)
    {
        $date = DateTime::createFromFormat('d/m/Y', $dateString);
        return $date ? $date->format('Y-m-d') : null;
    }

    public function importFile()
    {
        return view('conti.import');
    }

    public function importFileCR()
    {
        return view('conti.importCR');
    }

    public function importFileGen()
    {
        return view('conti.importGen');
    }



  /*  public function test()
    {
        Movimenti::getYearsFromMovimenti();
    }*/

    public function manageRedirect(Request $request)
    {
        return redirect('/admin/movimenti/reportbudget/'.$request['anno']);
    }

    public function updateMovimenti($id)
    {
        $mov=Movimenti::getMovimentoById($id);
        return json_encode($mov);
    }

}
