<?php

namespace App\Console\Commands;

use Carbon\Carbon;
use Codexshaper\WooCommerce\Facades\Product;
use Illuminate\Console\Command;
use App\Setting;
use App\Article;
use App\Mylog;
use App\Stock;
use Codexshaper\WooCommerce\Models\Product as ModelsProduct;
use Codexshaper\WooCommerce\Facades\Variation;
use Codexshaper\WooCommerce\Facades\Category;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\DB;


class ProductUpdateQta extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'product:updateqta';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Aggiorna qta prodotti da GM';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $aggiornato = false;
        set_time_limit(0);
        ini_set("memory_limit", "512M");
        $ora_update = Carbon::now();
        $settingora = Setting::where('key', 'update_products_qta')->first();
        $fromtime = str_replace('-', '', $settingora->value);


        $loginizio = 'Inizio da ' . $ora_update . "\n";

        Log::channel('updateproductsqta')->notice($loginizio);

        /* $stocks = Stock::join(DB::raw('(SELECT Codice, MAX(DataOra) as data1 from T_WEB_Disponibile GROUP BY Codice ) b'), function($join)
               {
                   $join->on('T_WEB_Disponibile.Codice', '=', 'b.Codice')
                       ->on('T_WEB_Disponibile.DataOra', '=', 'b.data1');
               } )
               ->where('data1','>=',$fromtime)
               ->orderBy('DataOra')
               ->get();
			   */
        $stocks = Stock::select('Codice', 'QtaDisponibile', DB::raw('MAX(DataOra) as data_recente'))
            ->where('DataOra', '>=', $fromtime)
            ->groupBy('Codice', 'QtaDisponibile')
            ->get();
        $nrprodotti = $stocks->count();

        $log = "";

        foreach ($stocks as $stock) {

            try {

                $productsku = Product::where('sku', $stock->Codice)->first();

                if ($productsku->count() > 0) {
                    $aggiorna = true;

                    $inprevendita = isArticleInPrevendita($stock->Codice, false);
                    $inprevendita_qtaneg = isArticleInPrevendita($stock->Codice, true);
                    $qtyinstock = intval($productsku['stock_quantity']);
                    $titolo = $productsku['title'];
                    // Se il libro è ancora in Prevendita e la quantità è > QTA_MINIMA_PER_PREVENDITA, allora non aggiornare la QTA
                    // deve rimanere a > QTA_MINIMA_PER_PREVENDITA per poter vedere "In Preordine"
                    if ($inprevendita && $qtyinstock > QTA_MINIMA_PER_PREVENDITA) {
                        $aggiorna = false;
                    }

                    if ($aggiorna) {
                        $data1 = [

                            'stock_quantity' => $stock->QtaDisponibile,

                        ];
                        $idprodotto = $productsku['parent_id'];
                        if ($idprodotto > 0) {
                            $variation = Variation::update($idprodotto, $productsku['id'], $data1);
                        } else {
                            Product::update($productsku['id'], $data1);
                        }

                        $log .= ' *** ' . $stock->Codice . ' ' . $titolo . ' QTA=' . $stock->QtaDisponibile . "\n";

                        if ($inprevendita_qtaneg && ($qtyinstock < QTA_MINIMA_PER_PREVENDITA)) {
                            setPreOrder($stock->Codice, "1", false);
                            $log .= ' SETTATO IN PREVENDITA ! <br>';
                        }

                        $aggiornato = true;
                    }
                }

                if ($log) {
                    Log::channel('updateproductsqta')->notice($log);
                    $log = "";
                }
            } catch (\Exception $e) {

                $log = "Errore: " . $e->getMessage() . "\n";
                Log::channel('updateproductsqta')->error($log);
                $log = "";

            }
        }
        $ora_fine = Carbon::now();

        $lognrprodotti = ' Prodotti qta aggiornati ' . $nrprodotti . "\n";
        $logfine = 'Terminato il ' . $ora_fine . "\n";
        $settingora->value = $ora_update;
        $settingora->save();

        if ($aggiornato) {
            Log::channel('updateproductsqta')->notice($lognrprodotti . $logfine);
            Mail::raw($loginizio . $lognrprodotti . $logfine, function ($message) {
                $message->to(Mylog::getEmail());
                $message->subject(Mylog::getSubjectEmail("Aggiornam. Qtà Prodotti:"));
            });
        }
    }
}
