<?php

namespace App\Console\Commands;

use App\Models\Asset;
use App\Models\CheckoutAcceptance;
use App\Models\Setting;
use App\Models\User;
use App\Notifications\CheckoutAssetNotification;
use App\Notifications\CurrentInventory;
use App\Notifications\UnacceptedAssetReminderNotification;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Notification;

class SendAcceptanceReminder extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'snipeit:acceptance-reminder';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'This will resend users with unaccepted assets a reminder to accept or decline them.';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $pending = CheckoutAcceptance::pending()->where('checkoutable_type', 'App\Models\Asset')
                                                ->whereHas('checkoutable', function($query) {
                                                    $query->where('accepted_at', null)
                                                          ->where('declined_at', null);
                                                })
                                                ->with(['assignedTo', 'checkoutable.assignedTo', 'checkoutable.model', 'checkoutable.adminuser'])
                                                ->get();

        $count = 0;
        $unacceptedAssetGroups = $pending
            ->filter(function($acceptance) {
                return $acceptance->checkoutable_type == 'App\Models\Asset';
            })
            ->map(function($acceptance) {
                return ['assetItem' => $acceptance->checkoutable, 'acceptance' => $acceptance];
            })
            ->groupBy(function($item) {
                return $item['acceptance']->assignedTo ? $item['acceptance']->assignedTo->id : '';
            });

        $no_mail_address = [];

        foreach($unacceptedAssetGroups as $unacceptedAssetGroup) {
            $item_count = $unacceptedAssetGroup->count();
            foreach ($unacceptedAssetGroup as $unacceptedAsset) {
//            if ($unacceptedAsset['acceptance']->assignedTo->email == ''){
//                $no_mail_address[] = $unacceptedAsset['checkoutable']->assignedTo->present()->fullName;
//            }
                if ($unacceptedAsset['acceptance']->assignedTo) {

                    if (!$unacceptedAsset['acceptance']->assignedTo->locale) {
                        Notification::locale(Setting::getSettings()->locale)->send(
                            $unacceptedAsset['acceptance']->assignedTo,
                            new UnacceptedAssetReminderNotification($unacceptedAsset['assetItem'], $count)
                        );
                    } else {
                        Notification::send(
                            $unacceptedAsset['acceptance']->assignedTo,
                            new UnacceptedAssetReminderNotification($unacceptedAsset, $item_count)
                        );
                    }
                    $count++;
                }
            }
        }

        if (!empty($no_mail_address)) {
            foreach($no_mail_address as $user) {
                return $user.' has no email.';
            }


        }



        $this->info($count.' users notified.');
    }
}