<?php

namespace App\Jobs;

use App\BlastWasap;
use Illuminate\Support\Facades\Http;
use App\Setting;
use Carbon\Carbon;
use App\KomuditiPurchase;
use Illuminate\Support\Facades\Log;

class WhatsappUnsoldCommodityNotification extends Job
{
    public $status;
    public $start_time;
    public $end_time;
    public $message;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $logger = app('job_log');

        try {
            $settings = Setting::on('mysql7')->where('group', 'unsold_commodity_notifications')->get();
            $status = $settings->where('key', 'status')->first()->value;
            $start_time = $settings->where('key', 'start_time')->first()->value;
            $end_time = $settings->where('key', 'end_time')->first()->value;
            $message = $settings->where('key', 'message')->first()->value;

            $latestKomoditi = KomuditiPurchase::on('mysql7')->latest()->first();
            $isAllKomoditiSold = $latestKomoditi->unit_komuditi === 0.0;
            $isLatestKomoditiToday = $latestKomoditi->created_at->isToday();

            $isWabotCredentialNotComplete = env('WABOT_API') === null || env('WABOT_INSTANCES_ID') === null || env('WABOT_TOKEN_KEYS') === null;
            $isNotActiveJobServer = env('ACTIVE_JOB_SERVER') !== true;

            $pic_key = 'pic_' . strtolower(Carbon::now()->englishDayOfWeek);
            $pic = json_decode($settings->where('key', $pic_key)->first()->value);

            $phone_numbers = array_map(function ($p) {
                if (isset($p->no_telefon)) {
                    return $p->no_telefon;
                }
            }, $pic);

            if ($isNotActiveJobServer) {
                $logger->error('Job server is not active');
                return false;
            }

            if ($isWabotCredentialNotComplete) {
                $logger->error('Wabot credential not complete');
                return false;
            }

            if ($phone_numbers[0] === NULL) {
                $logger->error('No PIC phone numbers detected');
                return false;
            }

            if ($status === '0') {
                $logger->info('Unsold commodity notifications are turned off, no notification will be sent');
                return false;
            }

            if (Carbon::parse($start_time) > Carbon::now()) {
                $logger->info('Start time is in the future');
                return false;
            }

            if (Carbon::parse($end_time) < Carbon::now()) {
                $logger->info('End time is in the past');
                return false;
            }
            
            if (! $isLatestKomoditiToday) {
                $logger->info('No commodity is bought today, so technically no komoditi is sold and notifications will not be sent');
                return false;
            }

            if ($isLatestKomoditiToday && $isAllKomoditiSold) {
                $logger->info('All today komoditi is sold');
                return false;
            }


            foreach ($phone_numbers as $phone_number) {
                $response = Http::get(env('WABOT_API'), [
                    'number' => $phone_number,
                    'type' => 'text',
                    'message' =>  $message,
                    'instance_id' => env('WABOT_INSTANCES_ID'),
                    'access_token' => env('WABOT_TOKEN_KEYS')
                ]);


                //insert log blast wasap
                $logblastwasap = new BlastWasap();
                $logblastwasap->kodcaw = 'OPERASI';
                $logblastwasap->notelefon = $phone_number;
                $logblastwasap->norujukan = 'Notifikasi Komoditi Tidak Terjual. ' . 'baki : ' . KomuditiPurchase::on('mysql7')->latest()->first()->unit_komuditi;
                $logblastwasap->status = $response;
                $logblastwasap->created_at = Carbon::now();
                $logblastwasap->updated_at = Carbon::now();
                $logblastwasap->save();

                $logger->info("WABOT - Notifikasi Komoditi Tidak Terjual" . $response);
            }



            dispatch((new WhatsappUnsoldCommodityNotification($this->message))->delay(Carbon::now()->addMinutes(15)));
        } catch (\Exception $e) {
            $logger->error($e);
            throw $e;
        }
    }
}
