<?php

namespace App\Console\Commands;

use App\Mail\test;
use App\Models\InvoiceValidation;
use App\Models\Plant;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;

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

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

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $schedule = $this->argument('schedule_type');
        // $scheduleType = $this->argument('scheduleType');
        $plantIdArg = (int) $this->argument('plant'); // can be 0 for all plants

        $mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')->get()->groupBy('rule_name');

        // $startDate = now()->setTime(8, 0, 0);
        // $endDate = now()->copy()->addDay()->setTime(8, 0, 0);

        $serialTableData = [];
        $materialTableData = [];
        $bundleTableData = [];

        // Get plant IDs: either one plant or all
        $plantIds = $plantIdArg == 0
            ? InvoiceValidation::select('plant_id')->distinct()->pluck('plant_id')->toArray()
            : [$plantIdArg];

        $no = 1;
        if (strtolower($schedule) == '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);
        }
        foreach ($plantIds as $plantId) {
            $plant = Plant::find($plantId);
            $plantName = $plant ? $plant->name : $plantId;

            // Serial Invoice
            $totalSerialCount = InvoiceValidation::where('plant_id', $plantId)
                ->whereNull('quantity')
                ->whereBetween('created_at', [$startDate, $endDate])
                ->distinct('invoice_number')
                ->count('invoice_number');

            $scannedSerialCount = InvoiceValidation::select('invoice_number')
                ->where('plant_id', $plantId)
                ->whereNull('quantity')
                ->whereBetween('updated_at', [$startDate, $endDate])
                ->groupBy('invoice_number')
                ->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)")
                ->count();

            $serialInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
                ->where('quantity', null)
                ->whereBetween('created_at', [$startDate, $endDate])
                ->count();

            $scannedInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
                ->where('scanned_status', 'Scanned')
                ->where(function ($query) {
                    $query->whereNull('quantity')
                        ->orWhere('quantity', 0);
                })
                ->whereBetween('updated_at', [$startDate, $endDate])
                ->count();

            $serialTableData[] = [
                'no' => $no,
                'plant' => $plantName,
                'totalInvoice' => $totalSerialCount,
                'scannedInvoice' => $scannedSerialCount,
                'totalInvoiceQuan' => $serialInvoiceQuan,
                'scannedInvoiceQuan' => $scannedInvoiceQuan,
            ];

            // Material Invoice
            $totalMatCount = InvoiceValidation::where('plant_id', $plantId)
                ->where('quantity', 1)
                ->whereBetween('created_at', [$startDate, $endDate])
                ->distinct('invoice_number')
                ->count('invoice_number');

            $scannedMatCount = InvoiceValidation::select('invoice_number')
                ->where('plant_id', $plantId)
                ->where('quantity', 1)
                ->whereBetween('updated_at', [$startDate, $endDate])
                ->groupBy('invoice_number')
                ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)")
                ->count();

            $totalMatInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
                ->where('quantity', 1)
                ->whereBetween('created_at', [$startDate, $endDate])
                ->count();

            $scannedMatInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
                ->where('quantity', 1)
                ->whereNotNull('serial_number')
                ->where('serial_number', '!=', '')
                ->whereBetween('updated_at', [$startDate, $endDate])
                ->count();

            $materialTableData[] = [
                'no' => $no,
                'plant' => $plantName,
                'totalInvoice' => $totalMatCount,
                'scannedInvoice' => $scannedMatCount,
                'totalInvoiceQuan' => $totalMatInvoiceQuan,
                'scannedInvoiceQuan' => $scannedMatInvoiceQuan,
            ];

            // Bundle Invoice
            $totalBundleCount = InvoiceValidation::where('plant_id', $plantId)
                ->where('quantity', '>', 1)
                ->whereBetween('created_at', [$startDate, $endDate])
                ->distinct('invoice_number')
                ->count('invoice_number');

            $scannedBundleCount = InvoiceValidation::select('invoice_number')
                ->where('plant_id', $plantId)
                ->where('quantity', '>', 1)
                ->whereBetween('updated_at', [$startDate, $endDate])
                ->groupBy('invoice_number')
                ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)")
                ->count();

            $totalBundleInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
                ->where('quantity', '>', 1)
                ->whereBetween('created_at', [$startDate, $endDate])
                ->count();

            $scannedBundleInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
                ->where('quantity', '>', 1)
                ->whereNotNull('serial_number')
                ->where('serial_number', '!=', '')
                ->whereBetween('updated_at', [$startDate, $endDate])
                ->count();

            $bundleTableData[] = [
                'no' => $no,
                'plant' => $plantName,
                'totalInvoice' => $totalBundleCount,
                'scannedInvoice' => $scannedBundleCount,
                'totalInvoiceQuan' => $totalBundleInvoiceQuan,
                'scannedInvoiceQuan' => $scannedBundleInvoiceQuan,
            ];

            $no++;
        }

        $mail = new test($serialTableData, $materialTableData, $bundleTableData, $schedule);
        $contentVars = $mail->content()->with;

        $this->info($contentVars['greeting'] ?? 'Invoice Report');

        // Send to SerialInvoiceMail recipients
        if ($mailRules->has('SerialInvoiceMail')) {
            $emails = $mailRules['SerialInvoiceMail']->pluck('email')->unique()->toArray();
            foreach ($emails as $email) {
                Mail::to($email)->send(new test($serialTableData, [], [], $schedule));
            }
        }

        // Send to MaterialInvoiceMail recipients (material + bundle table)
        if ($mailRules->has('MaterialInvoiceMail')) {
            $emails = $mailRules['MaterialInvoiceMail']->pluck('email')->unique()->toArray();
            foreach ($emails as $email) {
                Mail::to($email)->send(new test([], $materialTableData, $bundleTableData, $schedule));
            }
        }

        // Send to InvoiceMail recipients (all three tables)
        if ($mailRules->has('InvoiceMail')) {
            $emails = $mailRules['InvoiceMail']->pluck('email')->unique()->toArray();
            foreach ($emails as $email) {
                Mail::to($email)->send(new test($serialTableData, $materialTableData, $bundleTableData, $schedule));
            }
        }

        // Show preview in console
        $this->info('--- Serial Invoice Table ---');
        $this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice', 'TotalInvoice Quantity', 'ScannedInvoice Quantity'], $serialTableData);

        $this->info('--- Material Invoice Table ---');
        $this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice', 'TotalInvoice Quantity', 'ScannedInvoice Quantity'], $materialTableData);

        $this->info('--- Bundle Invoice Table ---');
        $this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice', 'TotalInvoice Quantity', 'ScannedInvoice Quantity'], $bundleTableData);

        $this->info($contentVars['wishes'] ?? '');
    }
}
