<?php

namespace App\Console\Commands;

use App\Mail\CharacteristicApprovalMail;
use App\Models\CharacteristicApproverMaster;
use App\Models\RequestCharacteristic;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Carbon;

class TriggerPendingApprovalMails extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    // protected $signature = 'app:trigger-pending-approval-mails';

    /**
     * The console command description.
     *
     * @var string
     */
    // protected $description = 'Command description';

    // /**
    //  * Execute the console command.
    //  */
    // public function handle()
    // {
    //     //
    // }

    protected $signature = 'approval:trigger-mails';
    protected $description = 'Trigger approval mail manually';

    public $pdfPath;

    public $subjectLine;

    public $wfId;


    public function handle()
    {
        $this->info('Approval mail job started');

        // .. Characteristic Mail trigger logic

        // $records = RequestCharacteristic::whereNull('approver_status1')
        // ->whereNull('approver_status2')
        // ->whereNull('approver_status3')
        // ->get();

        $records = RequestCharacteristic::where(function ($q) {
                $q->whereNull('approver_status1')
                ->orWhere('approver_status1', 'Hold');
            })
            ->where(function ($q) {
                $q->whereNull('approver_status2')
                ->orWhere('approver_status2', 'Hold');
            })
            ->where(function ($q) {
                $q->whereNull('approver_status3')
                ->orWhere('approver_status3', 'Hold');
            })
            ->get();

        $records = $records->filter(function ($item) {
            $approver = CharacteristicApproverMaster::find($item->characteristic_approver_master_id);
            return $approver && $approver->approver_type == 'Characteristic';
        });

        if ($records->isEmpty()) {
            $this->info('No pending approvals');
            return;
        }

        $grouped = $records->groupBy(function ($item) {
            $this->wfId = $item->work_flow_id;
            return $item->plant_id . '|' . $item->machine_id . '|' . $item->aufnr . '|' . $item->work_flow_id;
        });

        $pendingApprovers = RequestCharacteristic::where('work_flow_id', $this->wfId)->latest()->first();

        $this->info($pendingApprovers->approver_status1, $pendingApprovers->approver_status2);


        $approverNameFromMaster = null;
        if ($pendingApprovers && $pendingApprovers->characteristic_approver_master_id) {
            $approverNameFromMaster = CharacteristicApproverMaster::find($pendingApprovers->characteristic_approver_master_id);
        }

        $rows = [];

        foreach ($grouped as $groupRecords) {

            $first = $groupRecords->first();

            $approver = CharacteristicApproverMaster::where('plant_id', $first->plant_id)
                ->where('machine_id', $first->machine_id)
                ->where('id', $first->characteristic_approver_master_id)
                ->first();

            if (!$approver) {
                continue;
            }

            $characteristics = $groupRecords->map(fn ($r) => [
                'work_flow_id'        => $r->work_flow_id,
                'characteristic_name' => $r->characteristic_name,
                'current_value'       => $r->current_value,
                'update_value'        => $r->update_value,
            ])->toArray();

            $level    = null;
            $mail     = null;
            $name     = null;
            $updateData = [];
            $now = Carbon::now();

            // --- FIRST MAIL ---
            if (is_null($first->mail_status)){
                $level = 1;
                $mail = $approver->mail1;
                $name = $approver->name1;

                $updateData['mail_status'] = 'Sent';

                if ($approver->duration1 > 0)
                {

                    $duration = number_format((float)$approver->duration1, 2, '.', '');
                    [$hours, $minutes] = explode('.', $duration);

                    $totalMinutes = ((int)$hours * 60) + (int)$minutes;

                    $updateData['trigger_at'] = $now
                        ->copy()
                        ->addMinutes($totalMinutes)
                        ->startOfMinute();
                }
                else
                {
                    $updateData['trigger_at'] = null;
                }
            }

            // --- SECOND MAIL ---
            elseif (
                $first->mail_status == 'Sent' &&
                (is_null($first->approver_status1) || $first->approver_status1 == 'Hold') &&
                $first->trigger_at &&
                \Carbon\Carbon::parse($first->trigger_at)->lte($now)
            ) {

                $this->info(
                    "mail_status: {$first->mail_status}, ".
                    "approver_status1: {$first->approver_status1}, ".
                    "trigger_at: {$first->trigger_at}, ".
                    "now: {$now}"
                );

                $level = 2;
                $mail = $approver->mail2;
                $name = $approver->name2;

                if ($approver->duration2 > 0) {

                    $duration = number_format((float)$approver->duration2, 2, '.', '');
                    [$hours, $minutes] = explode('.', $duration);

                    $totalMinutes = ((int)$hours * 60) + (int)$minutes;

                    $updateData['trigger_at'] = $now->copy()->addMinutes($totalMinutes);
                } else {
                    $updateData['trigger_at'] = null;
                }

                $updateData['mail_status'] = 'Sent-Mail2';
            }

            // --- THIRD MAIL ---
            elseif (
                $first->mail_status == 'Sent-Mail2' &&
                (is_null($first->approver_status1) || $first->approver_status1 == 'Hold') &&
                (is_null($first->approver_status2) || $first->approver_status2 == 'Hold') &&
                $first->trigger_at &&
                \Carbon\Carbon::parse($first->trigger_at)->lte($now)
            ) {
                $level = 3;
                $mail = $approver->mail3;
                $name = $approver->name3;

                $updateData['trigger_at'] = null;
                $updateData['mail_status'] = 'Sent-Mail3';
            }

            if (!$level || !$mail) {
                continue;
            }

            $pdfPath = 'uploads/LaserDocs/' . $first->work_flow_id . '.pdf';

            $subjectLine = 'Characteristic Approval Mail';

            Mail::to($mail)->send(
                new CharacteristicApprovalMail(
                    $first,
                    $name,
                    $level,
                    $pdfPath,
                    $pendingApprovers,
                    $approverNameFromMaster,
                    $subjectLine,
                    $characteristics
                )
            );

            RequestCharacteristic::whereIn('id', $groupRecords->pluck('id'))
                ->update($updateData);

            $rows[] = [
                $first->id,
                $first->plant_id,
                $first->machine_id,
                "Level $level",
                $mail,
                'SENT'
            ];
        }


        // .. Quality Mail trigger logic

        $qualityRecords = RequestCharacteristic::where(function ($q) {
                $q->whereNull('approver_status1')
                ->orWhere('approver_status1', 'Hold');
            })
            ->where(function ($q) {
                $q->whereNull('approver_status2')
                ->orWhere('approver_status2', 'Hold');
            })
            ->where(function ($q) {
                $q->whereNull('approver_status3')
                ->orWhere('approver_status3', 'Hold');
            })
            ->get();

        $qualityRecords = $qualityRecords->filter(function ($item) {
            $approver = CharacteristicApproverMaster::find($item->characteristic_approver_master_id);
            return $approver && $approver->approver_type == 'Quality';
        });

        if ($qualityRecords->isEmpty()) {
            $this->info('No quality pending approvals');
            return;
        }

        $grouped = $qualityRecords->groupBy(function ($item) {
            $this->wfId = $item->work_flow_id;
            return $item->plant_id . '|' . $item->machine_id . '|' . $item->aufnr . '|' . $item->work_flow_id;
        });

        $pendingApprovers = RequestCharacteristic::where('work_flow_id', $this->wfId)->latest()->first();

        $approverNameFromMaster = null;
        if ($pendingApprovers && $pendingApprovers->characteristic_approver_master_id) {
            $approverNameFromMaster = CharacteristicApproverMaster::find($pendingApprovers->characteristic_approver_master_id);
        }

        $rows = [];

        foreach ($grouped as $groupRecords) {

            $first = $groupRecords->first();

            $approver = CharacteristicApproverMaster::where('plant_id', $first->plant_id)
                ->where('machine_id', $first->machine_id)
                ->where('id', $first->characteristic_approver_master_id)
                ->first();

            if (!$approver) {
                continue;
            }

            $level    = null;
            $mail     = null;
            $name     = null;
            $updateData = [];
            $now = Carbon::now();

            // --- FIRST MAIL ---
            if (is_null($first->mail_status)){
                $level = 1;
                $mail = $approver->mail1;
                $name = $approver->name1;

                $updateData['mail_status'] = 'Sent';

                if ($approver->duration1 > 0)
                {

                    $duration = number_format((float)$approver->duration1, 2, '.', '');
                    [$hours, $minutes] = explode('.', $duration);

                    $totalMinutes = ((int)$hours * 60) + (int)$minutes;

                    $updateData['trigger_at'] = $now
                        ->copy()
                        ->addMinutes($totalMinutes)
                        ->startOfMinute();
                }
                else
                {
                    $updateData['trigger_at'] = null;
                }
            }

            // --- SECOND MAIL ---
            elseif (
                $first->mail_status == 'Sent' &&
                (is_null($first->approver_status1) || $first->approver_status1 == 'Hold') &&
                $first->trigger_at &&
                \Carbon\Carbon::parse($first->trigger_at)->lte($now)
            ) {
                $level = 2;
                $mail = $approver->mail2;
                $name = $approver->name2;

                if ($approver->duration2 > 0) {

                    $duration = number_format((float)$approver->duration2, 2, '.', '');
                    [$hours, $minutes] = explode('.', $duration);

                    $totalMinutes = ((int)$hours * 60) + (int)$minutes;

                    // IMPORTANT: use NOW, not old trigger
                    $updateData['trigger_at'] = $now->copy()->addMinutes($totalMinutes);
                } else {
                    $updateData['trigger_at'] = null;
                }

                $updateData['mail_status'] = 'Sent-Mail2';
            }

            // --- THIRD MAIL ---
            elseif (
                $first->mail_status == 'Sent-Mail2' &&
                (is_null($first->approver_status1) || $first->approver_status1 == 'Hold') &&
                (is_null($first->approver_status2) || $first->approver_status2 == 'Hold') &&
                $first->trigger_at &&
                \Carbon\Carbon::parse($first->trigger_at)->lte($now)
            ) {
                $level = 3;
                $mail = $approver->mail3;
                $name = $approver->name3;

                $updateData['trigger_at'] = null;
                $updateData['mail_status'] = 'Sent-Mail3';
            }

            if (!$level || !$mail) {
                continue;
            }

            $pdfPath = ($f = glob(storage_path('app/private/uploads/LaserDocs/' . $first->work_flow_id . '.*')))
                ? 'uploads/LaserDocs/' . basename($f[0])
                : null;

            $this->info( $pdfPath);

            $subjectLine = 'Quality Approval Mail';

            Mail::to($mail)->send(
                new CharacteristicApprovalMail(
                    $first,
                    $name,
                    $level,
                    $pdfPath,
                    $pendingApprovers,
                    $approverNameFromMaster,
                    $subjectLine,
                    $characteristics
                )
            );

            RequestCharacteristic::whereIn('id', $groupRecords->pluck('id'))
                ->update($updateData);

            $rows[] = [
                $first->id,
                $first->plant_id,
                $first->machine_id,
                "Level $level",
                $mail,
                'SENT'
            ];
        }

        $this->table(
            ['ID', 'Plant', 'Machine', 'Level', 'Mail', 'Status'],
            $rows
        );

        $this->info('Approval mail job completed');
    }
}
