<?php

namespace App\Console\Commands;

use App\Mail\ProductionMail;
use App\Models\Line;
use App\Models\Plant;
use App\Models\ProductionPlan;
use App\Models\ProductionQuantity;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;

class SendProductionReport extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    // protected $signature = 'send:production-report';
    protected $signature = 'send:production-report {schedule_type} {plant}';

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

    /**
     * Execute the console command.
     */
    public function handle()
    {
        // ini_set('max_execution_time', 0); // disable limit
        // set_time_limit(0);

        $scheduleType = $this->argument('schedule_type');
        $plantId = (int) $this->argument('plant'); // cast to int for safety

        // Fetch mail rules based on schedule type
        $mailRules = \App\Models\AlertMailRule::where('module', 'ProductionQuantities')
            ->where('rule_name', 'ProductionMail')
            ->where('schedule_type', $scheduleType)
            ->where('plant', $plantId)
            ->get();

        $emails = $mailRules->pluck('email')->unique()->toArray();

        $plants = $plantId == 0
            ? Plant::all()
            : Plant::where('id', $plantId)->get();

        if ($plants->isEmpty()) {
            $this->error('No valid plant(s) found.');

            return;
        }

        // $startDate = now()->setTime(8, 0, 0);
        // $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
        if (strtolower($scheduleType) == 'daily') {
            $startDate = now()->subDay()->setTime(8, 0, 0);
            $endDate = now()->setTime(8, 0, 0);
        } else {
            $startDate = now()->setTime(8, 0, 0);
            $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
        }

        $PlanstartDate = now()->setTime(8, 0, 0);
        $planendDate = now()->copy()->addDay()->setTime(7, 59, 0);

        $tableData = [];
        $no = 1;

        // .

        foreach ($plants as $plant) {
            $lines = Line::where('plant_id', $plant->id)->get();

            foreach ($lines as $line) {
                $targetQuantity = ProductionPlan::where('plant_id', $plant->id)
                    ->where('line_id', $line->id)
                    ->whereBetween('created_at', [$PlanstartDate, $planendDate])
                    ->sum('plan_quantity');

                /** @phpstan-ignore property.notFound */
                if (strtolower($line->type) == 'fg line') {
                    $productionQuantity = \App\Models\QualityValidation::where('plant_id', $plant->id)
                        ->where('line_id', $line->id)
                        ->whereBetween('created_at', [$startDate, $endDate])
                        ->count();
                } else {
                    $productionQuantity = ProductionQuantity::where('plant_id', $plant->id)
                        ->where('line_id', $line->id)
                        ->whereBetween('created_at', [$startDate, $endDate])
                        ->count();
                }

                $tableData[] = [
                    'no' => $no++,
                    'plant' => $plant->name,
                    'line' => $line->name,
                    'type' => $line->type,
                    'targetQuantity' => $targetQuantity,
                    'productionQuantity' => $productionQuantity,
                ];
            }
        }

        // $this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $fgTableData);

        // $this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $tableData);

        // if (!empty($emails)) {
        //     foreach ($emails as $email) {
        //         Mail::to($email)->send(new ProductionMail($tableData));
        //     }
        // } else {
        //     $this->info('No recipients found for ProductionMailAlert.');
        // }

        // $this->info("Production report sent to " . count($emails) . " recipient(s).");
        // Preview in console
        $mail = new ProductionMail($scheduleType, $tableData);
        $contentVars = $mail->content()->with;

        $this->info($contentVars['greeting'] ?? 'Production Report');
        $this->table(
            ['No', 'Plant', 'Line', 'Type', 'Target Quantity', 'Production Quantity'],
            $tableData
        );
        $this->info($contentVars['wishes'] ?? '');

        // Send mails
        if (! empty($emails)) {
            foreach ($emails as $email) {
                Mail::to($email)->send(new ProductionMail($scheduleType, $tableData));
            }
            $this->info('Production report sent to '.count($emails).' recipient(s).');
        } else {
            $this->warn('No recipients found for ProductionMailAlert.');
        }
    }
}
