<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

use App\Models\Company;
use App\Models\CompanyUser;
use App\Models\Worker as Workers;
use App\Jobs\Command\ProcessSendEmailAdminNoticationForCompanyUsage;
use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\DB;

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Everyday, send email notification on super admin admin in regards to daily company usage: updates on company users/employees';

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

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $dateToday = date('Y-m-d');

        $companies = Workers::select('id')->whereDate('created_at', 'LIKE', $dateToday . '%')->get();

        if (!$companies->isEmpty()) {

            $companies = CompanyUser::select('company_users.company_id')->whereDate('created_at', 'LIKE', $dateToday . '%')->distinct()->limit(20)->get();
            $hold = [];
            $batch = Bus::batch([])->onConnection('jobs_emails')->name('Company Usage')->onQueue('sendemail')->allowFailures(true)->dispatch();
            echo 'Queuing adminnotification : companies usage ' . date('l jS \of F Y h:i:s A') . "\n";

            foreach ($companies as $company) {
                if ($company->company_id) {
                    $companyDetails = Company::select(
                        'companies.id',
                        'companies.name as company_name',
                        'company_subscription_rates.name as subscription',
                        DB::raw(
                            '(
                                SELECT COUNT(DISTINCT(worker_id))
                                FROM company_users
                                WHERE company_id = ' . $company->company_id . '
                            ) as no_of_members'
                        ),
                    )
                        ->leftJoin('company_subscriptions', 'company_subscriptions.company_id', 'companies.id')
                        ->leftJoin('company_subscription_rates', 'company_subscription_rates.id', 'company_subscriptions.subscription_rate_id')
                        ->where('companies.id', $company->company_id)
                        ->first();

                    $listOfNewWorkers = Workers::select(
                        'workers.id',
                        'workers.email_address',
                        DB::raw('CONCAT(workers.first_name, " ", workers.last_name) as name'),
                        'company_users.company_id'
                    )
                        ->join('company_users', 'company_users.worker_id', 'workers.id')
                        ->with('roles')
                        ->where('company_users.company_id', $company->company_id)
                        ->whereDate('workers.created_at', 'LIKE', $dateToday . '%')
                        ->distinct()
                        ->limit(20)
                        ->get();
                    if ($companyDetails) {
                        $companyDetailsToBeprocess = [
                            'company_name' => $companyDetails->company_name,
                            'subscription' => ($companyDetails->subscription) ? $companyDetails->subscription : 'Not yet subscribed',
                            'no_of_members' => $companyDetails->no_of_members,
                            'date_transacted' => date("F j, Y"),
                        ];
                        $batch->add(new ProcessSendEmailAdminNoticationForCompanyUsage((object) $companyDetailsToBeprocess, $listOfNewWorkers));
                    }
                }
            }
        } else {
            echo 'No company have updated their company usage today ' . now();
        }

    }
}
