<?php

namespace App\Console\Commands;

use App\Tools\SendinBlueEmailService;
use App\UserEmailCampaign;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class MailCampaignStatusCheckFromSendinBlue extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'check:mail-campaign-status';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Check Mail Campaign Status From SendinBlue';


    private $sendinblue;

    public function __construct()
    {
        parent::__construct();
        $this->sendinblue = new SendinBlueEmailService();
    }


    public function handle()
    {
        $currentTimeStamp = Carbon::now()->format('Y-m-d H:i:s');

        $this->appLog("============================== START CHECKING MAIL CAMPAIGN FROM SENDINBLUE API ==============================");
        $this->appLog("============================== START CHECKING MAIL CAMPAIGN FROM SENDINBLUE API ==============================");

        // Get all pushed campaigns
        $allPushedCampaigns = UserEmailCampaign::query()
            ->whereNotNull('schedule_at')->whereNotNull('mail_campaign_id')
//            ->whereIn('status',['queued','pushed'])
            ->whereNotIn('status',['sent'])
            ->where('schedule_at','<=',$currentTimeStamp)->get();

        $allPushedCampaigns->map(function ($campaign){

            $responsePublishedCampaign = $this->get_published_campaign($campaign->mail_campaign_id);

            if (isset($responsePublishedCampaign['id']) && isset($responsePublishedCampaign['status'])){

                if ($responsePublishedCampaign['status'] == 'sent'){

                    $campaign->update([
                        'status' => $responsePublishedCampaign['status'],
                        'count'=>++$campaign->count,
                        'is_sent'=>true
                    ]);


                    // Delete Mail Contacts On ONLY Sendinblue & leave locally based contacts
                    if (isset($campaign->user_mailing_list->subscribers)){
                        $subscribers = $campaign->user_mailing_list->subscribers;
                        $this->delete_published_and_local_contacts($subscribers);
                    }

                }
                else{

                    $campaign->update([
                        'status' => $responsePublishedCampaign['status'],
                    ]);
                }

            }
        });


        $this->appLog("============================== END CHECKING MAIL CAMPAIGN FROM SENDINBLUE API ==============================");
        $this->appLog("============================== END CHECKING MAIL CAMPAIGN FROM SENDINBLUE API ==============================");
    }



    public function get_published_campaign($mailCampaignId)
    {
        $endpoint = 'get-single-campaign-email/'.$mailCampaignId;
        $sendinblue =  $this->sendinblue;

        return $sendinblue->getApiCall($endpoint);
    }


    // NOTE: Only remote contacts are deleted
    public function delete_published_and_local_contacts($subscribers){

        try {
            foreach ($subscribers as $subscriber) {

                $subscriberEmail = $subscriber->email_address;
                $endpoint = "delete-contact/{$subscriberEmail}";
                $response = $this->sendinblue->deleteApiCall($endpoint);

                if (isset($response['status']) && ($response['status'] ?? '') == 'success') {

                    // Don't delete contact locally
                    // $subscriber->delete();
                    // $subscriber->update(['status' => 'temporal']);
                    $this->sendinblue->appLog("Successful in Deleting Mail Contact From remote");

                } else {
                    $this->sendinblue->appLog("Error Encountered while Deleting Mail Contact | Error: " . json_encode($response['message']));
                }

            }

        } catch (\Exception $e) {
            $this->sendinblue->appLog("Failed Deleting Mail Contact | Response: " . json_encode($e->getMessage()));
        }

    }


    public function appLog($message)
    {
        Log::channel('api_request')->info("\n");
        Log::channel('api_request')->info($message);
    }

}
