<?php

namespace App\Http\Controllers\V1\Cron;

use DB;
use Swift_Mailer;
use Carbon\Carbon;
use App\Models\MailReport;
use App\Models\Lot;
use App\Models\LotOwner;
use Swift_SmtpTransport;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Models\MailScheduledHistory;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\V1\ApiResponse;
use App\Repository\MailingRepo;
use Illuminate\Support\Facades\Validator;


class MailCron extends ApiResponse
{

    private const MAIL_SCHEDULED = 1;

    private $mailRepo;
    /**
     * Instantiate a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->mailRepo = new MailingRepo();
    }

    /**
     * CronJob - Mail
     * @param \Illuminate\Http\Request
     * @return \Illuminate\Http\JsonResponse
     */

    protected function triggerScheduledMail(Request $request)
    {
        set_time_limit(0);

        $archivedSessions = MailScheduledHistory::with('ArchivedSession')
            ->where('mail_scheduled_status', self::MAIL_SCHEDULED)
            ->get();

        $docType = $archivedSessions->first()->doc_type;

        foreach ($archivedSessions as $archivedSession) {
            $lots = Lot::where('id', $archivedSession['ArchivedSession']->lot_id)
                ->with('serviceProvider', 'site', 'serviceProviderConfig')
                ->get();

            foreach ($lots as $lot) {
                try {
                    $this->mailRepo->processLotAndSendEmail($lot, $archivedSession);
                } catch (\Throwable $th) {
                    Log::error("Error processing ArchivedSession ID: {$archivedSession['ArchivedSession']->id}, Error: {$th->getMessage()}");

                    MailScheduledHistory::where('archived_session_id', $archivedSession['ArchivedSession']->id)
                        ->update(['message' => $th->getMessage()]);
                    continue;
                }
            }
           // $this->mailRepo->scheduleMailReport($archivedSession->archivedSession);
        }

        set_time_limit(30);
    }

    public function sendMailReports()
    {
        $mails = MailReport::where('is_delivered', 0)
            ->where('deliver_on', Carbon::today()->format('Y-m-d'))
            ->get();

        if ($mails->isEmpty()) {
            Log::info("No Mail Reports to send!");
            return;
        }

        foreach ($mails as $mail) {
            $payload = $this->mailRepo->generateMailReportPayload($mail);
            $this->mailRepo->sendEmailViaZeptoMail($payload);
            $mail->is_delivered = 1;
            $mail->updated_at = Carbon::now();
            $mail->save();
        }
        $count = sizeof($mails);
        Log::info("$count Mail Reports sent successfully");
    }
 
   }
