<?php

namespace App\Console\Commands;

use App\Mylog;
use App\Order as AppOrder;
use App\Services\ProductLogger;
use Codexshaper\WooCommerce\Facades\Order;
use Illuminate\Console\Command;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Mail;

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Aggiornamenti ordini da GM';

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

    /**
     * Handles the order update process from GM.
     *
     * This command fetches orders from WooCommerce with a pending, processing, or on-hold status, and checks if they exist in the GM system. If an order is found in GM, it checks the status and updates the WooCommerce order accordingly. If an order is updated, an email is sent to the admin with the details.
     *
     * @return int
     */
    public function handle()
    {
        echo "OrderUpdateGM... ";
        $productLogger = new ProductLogger(null, 'checkorders', true);
        $page = 1;
        $orderupdated = 0;
        try {
            $all_orderswoo = new Collection();  // Assicurati che all_orderswoo sia inizializzato se non l'hai già fatto.
            $page = 1; // Inizializza la pagina

            do {
                $options = ['per_page' => 100, 'page' => $page, 'status' => ["pending", "processing", "on-hold"]];
                $this->info('Fetching orders with options: ' . json_encode($options));
                $orderswoo = Order::get($options); // Usa 'get' invece di 'all'

                // Controlla se il risultato è una collezione o un errore
                if (empty($orderswoo) || $orderswoo->isEmpty()) {
                    $productLogger->addLog('Error', 'No orders returned.');
                    break; // Esci dal ciclo in caso di errore
                }

                // Merge le nuove ordinazioni nella collezione esistente
                $all_orderswoo = $all_orderswoo->merge($orderswoo);
                $page++;
            } while ($orderswoo->count() > 0); // Continua finché ci sono ordini

        } catch (\Exception $e) {
            if (isset($productLogger)) {
                $productLogger->addLog('Error', $e->getMessage());
                $productLogger->setLogandSendEmail('Ordini');
            }
        }


        foreach ($all_orderswoo as $orderwoo) {
            $productLogger->addLog('', "Processing order #{$orderwoo->id}...");
            $ordergm = AppOrder::where('IdInternet', $orderwoo->id)->latest('DataOra')->first();
            if ($ordergm) {
                $productLogger->addLog('', "Order #{$orderwoo->id} found in GM, checking status...");
                if ($orderwoo->status == 'processing') {
                    $this->info("Order #{$orderwoo->id} is processing, checking if it needs to be completed...");
                    if ($ordergm->EnabledWoo == 1) {
                        $productLogger->addLog('', "Order #{$orderwoo->id} needs to be completed, updating WooCommerce...");
                        $data = [
                            'status' => 'completed',
                        ];
                        $orderwooupdate = Order::update($orderwoo->id, $data);

                        // sum the number updated of order to the log
                        $orderupdated++;
                    }
                } elseif ($orderwoo->status == 'on-hold') {
                    $productLogger->addLog('', "Order #{$orderwoo->id} is on-hold, checking if it needs to be processed...");
                    if ($ordergm->FlagSospeso == 0) {
                        $productLogger->addLog('', "Order #{$orderwoo->id} needs to be processed, updating WooCommerce...");
                        $data = [
                            'status' => 'processing',
                        ];
                        $orderwooupdate = Order::update($orderwoo->id, $data);

                        // sum the number updated of order to the log
                        $orderupdated++;
                    }
                }
            } else {
                $productLogger->addLog('', "Order #{$orderwoo->id} not found in GM, skipping...");
            }
        }

        // get the directory actual name and put in the log file        

        $log = ' Ordini aggiornati' . "\n";

        // check if there are orders to log
        if ($orderupdated > 0) {
            // Send the email to the admin with the details of the order log
            Mail::raw($log, function ($message, $orderupdated) {
                $message->to(Mylog::getEmail());
                $message->subject(Mylog::getSubjectEmail("Ordini Aggiornati su GM:" . $orderupdated));
            });

            if ($productLogger) {
                $productLogger->setLogandSendEmail('Aggiornamento Ordini');
            }
        }
    }
}
