<?php

namespace App\Console\Commands;

use App\Jobs\EmailJob;
use App\Jobs\EndSubJob;
use App\Models\Cobranca;
use App\Models\Definicao;
use App\Models\ItemPedido;
use App\Models\Pedidos;
use App\Models\Proforma;
use App\Models\Proprietario;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use Exception;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use PHPMailer\PHPMailer\PHPMailer;
use Illuminate\Support\Str;

class DaylySubscriptionMail extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'message:subscription';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Comnado para verificar as subscricoes diariamente';

    /**
     * Execute the console command.
     */
    /* function email($assunto, $para, $pdf, $user, $dias)
    {
        try {
            // Configurações do servidor SMTP
            $smtp_server = env('MAIL_HOST');
            $port = 465; // ou 587 para TLS, 465 para SSL
            $sender_email = env('MAIL_USERNAME');
            $password = env('MAIL_PASSWORD');

            // Destinatário
            $receiver_email = $para;

            // Crie uma nova instância do PHPMailer
            $mail = new PHPMailer(true);

            // Configurações do servidor SMTP
            // $html = file_get_contents(resource_path('views/mail/emails/email_template.html'));
            $mail->isSMTP();
            $mail->CharSet = 'UTF-8';
            $mail->Host = $smtp_server;
            $mail->SMTPAuth = true;
            $mail->Username = $sender_email;
            $mail->Password = $password;
            $mail->SMTPSecure = 'ssl'; // Use 'tls' para TLS
            $mail->Port = $port;

            // Remetente e destinatário
            $mail->isHTML(true);
            $mail->setFrom($sender_email, env('MAIL_FROM_NAME'));
            $mail->addAddress($receiver_email, 'ITS');
            $attachmentPath = public_path('storage/pdfs/' . $pdf);
            $mail->addAttachment($attachmentPath);
            // Assunto e corpo do e-mail
            $mail->Subject = $assunto;
            $mail->Body = "
                            <div style='color:black'>
                            Caro(a) <strong>$user</strong>, 
                                <p>Viemos informar que o seu serviço vai expirar dentro de $dias dias, veja a factura proforma nos anexos para fazer o pagamento para renovação.</p>
                           </div>
                           <div style='margin-top:20px'>
                           
                           </div>

                           <div>
                          
                          
                           <p></p>
                           <p> Atenciosamente,</p>
                           <p> Dpto. de Vendas ITS</p>
                           <p>INOARENA - Tecnologias e Sistemas</p>
            ";
            // $mail->Body = 

            // Enviar e-mail
            $mail->send();
        } catch (Exception $e) {
            ds($e);
        }
    } */
   /*  public function handle()
    {
        $hoje = Carbon::today();
        $Itemlista = [];
        $us = [];
        $anoAtual = date('Y');
        $user = null;
        $prop = [];
        $proprietario = [];
        $dataAtual = Carbon::now();
        $items = ItemPedido::where('estado', '!=', 'pendente')->get();
        $itemsGroupedByToken = $items->groupBy('token');
        try {
            foreach ($itemsGroupedByToken as $token => $items) {
                $total = null;
                $exists = DB::table('cobrancas')->where('token', $token)->exists();
    
                // Agrupar itens por data de expiração
                $itemsGroupedByExpiration = $items->groupBy(function ($item) {
                    return $item->diasParaExpirar($item->id);
                });
    
                foreach ($itemsGroupedByExpiration as $expirationDate => $itemsWithSameExpiration) {
                    if ($exists) {
                        $cobranca = Cobranca::where('token', $token)->first();
                        $dias_aviso = $hoje->diffInDays($cobranca->utimo_aviso, false);
                        $data_expiracao_min = $expirationDate;
    
                        if (intval($data_expiracao_min) < 45 && $data_expiracao_min > 0) {
                            if ($dias_aviso == 5) {
                                $cobranca->utimo_aviso = $hoje;
                                $cobranca->update();
                                EmailJob::dispatch('AVISO DE PAGAMENTO', $cobranca->user_email, $cobranca->proforma, $cobranca->user_name, $data_expiracao_min);
                            }
                        } elseif ($data_expiracao_min == 0) {
                            foreach ($itemsWithSameExpiration as $item) {
                                $item->update(['estado' => "Expirado"]);
                                Log::info("Estado atualizado com sucesso");
                            }
                        }
                    } else {
                        $data_expiracao_min = $expirationDate;
    
                        if ($data_expiracao_min < 45 && $data_expiracao_min > 0) {
                            foreach ($itemsWithSameExpiration as $item) {
                                $total += $item['preco'];
                                array_push($prop, $item->proprietario);
                                array_push($us, $item->pedido->user);
                                $user = array_unique($us)[0];
                                $proprietario = array_unique($prop)[0];
                            }
    
                            $pedido = Pedidos::create([
                                'user_id' => $user->id,
                                'total' => $total,
                                'vencimento' => $dataAtual->addYear(),
                                'categoria' => 'renovação',
                            ]);
                            $pedido->codigo = $anoAtual . '/' . $pedido->id;
                            $pedido->update();
    
                            if ($proprietario) {
                                foreach ($itemsWithSameExpiration as $item) {
                                    $item->update(['estado' => "a expirar"]);
                                    $pedido->items()->create([
                                        'servico_id' => $item->servico_id,
                                        'quantidade' => $item->quantidade,
                                        'preco' => $item->preco,
                                        'subtotal' => $item->quantidade * $item->preco,
                                        'proprietario_id' => $proprietario->id,
                                        'domain' => $item->domain ?? 'sem dominio',
                                        'categoria' => 'renovação',
                                        'periodo' => $item->periodo,
                                        "data_activacao" => $item->data_activacao,
                                        "data_domain" => $item->data_domain,
                                        "token" => $token,
                                    ]);
                                }
                            } else {
                                foreach ($itemsWithSameExpiration as $item) {
                                    $item->update(['estado' => "a expirar"]);
                                    $pedido->items()->create([
                                        'servico_id' => $item->servico_id,
                                        'quantidade' => $item->quantidade,
                                        'preco' => $item->preco,
                                        'subtotal' => $item->quantidade * $item->preco,
                                        'domain' => $item->domain ?? 'sem dominio',
                                        'categoria' => 'renovação',
                                        'periodo' => $item->periodo,
                                        "data_activacao" => $item->data_activacao,
                                        "data_domain" => $item->data_domain,
                                        "token" => $token,
                                    ]);
                                }
                            }
    
                            $definicoes = Definicao::first();
                            $pedido = Pedidos::find($pedido->id);
    
                            $pdf = Pdf::loadView('pdf', ['pedido' => $pedido, 'definicao' => $definicoes]);
                            $name = 'proforma_' . $pedido->id . '_' . $pedido->user->name . '_' . $pedido->created_at->format('d-m-Y') . '.pdf';
                            $pdfContent = $pdf->output();
                            Storage::put('pdfs/' . $name, $pdfContent);
                            Proforma::create([
                                'pdf' => $name,
                                'pedido_id' => $pedido->id
                            ]);
                            Cobranca::create([
                                'token' => $token,
                                'proforma' => $name,
                                'user_email' => $user->email,
                                'user_name' => $user->name,
                                'data_expiracao' => $data_expiracao_min,
                                'utimo_aviso' => Carbon::today()
                            ]);
                            EmailJob::dispatch('AVISO DE PAGAMENTO', $user->email, $name, $user->name, $data_expiracao_min);
    
                            Log::info("Estado atualizado com sucesso");
                        } elseif ($data_expiracao_min <= 0) {
                            foreach ($itemsWithSameExpiration as $item) {
                                $item->update(['estado' => "Expirado"]);
                                Log::info("Estado atualizado com sucesso");
                            }
                        }
                    }
                }
            }
        } catch (\Throwable $th) {
            ds($th);
        }
    } */

    public function handle () {
        $hoje = Carbon::today();
        $dataAtual = Carbon::now();
        $anoAtual = date('Y');
        $items = ItemPedido::where('estado', '!=', 'pendente')->get();
        $itemsGroupedByToken = $items->groupBy('token');

        try {
            foreach ($itemsGroupedByToken as $token => $items) {
                $exists = DB::table('cobrancas')->where('token', $token)->exists();

                // Agrupar itens por data de expiração
                $itemsGroupedByExpiration = $items->groupBy(function ($item) {
                    return $item->diasParaExpirar($item->id);
                });

                foreach ($itemsGroupedByExpiration as $expirationDate => $itemsWithSameExpiration) {
                    if ($exists) {
                        $cobranca = Cobranca::where('token', $token)->first();
                        $dias_aviso = $hoje->diffInDays($cobranca->utimo_aviso, false);

                        if (intval($expirationDate) < 45 && $expirationDate > 0) {
                            if ($dias_aviso == 5) {
                                $cobranca->utimo_aviso = $hoje;
                                $cobranca->update();
                                EmailJob::dispatch('AVISO DE PAGAMENTO', $cobranca->user_email, $cobranca->proforma, $cobranca->user_name, $expirationDate);
                            }
                        } elseif ($expirationDate == 0) {
                            foreach ($itemsWithSameExpiration as $item) {
                                $item->update(['estado' => "Expirado"]);
                                EndSubJob::dispatch('CANCELAMENTO DE SERVIÇOS', $cobranca->user_email, $cobranca->proforma, $cobranca->user_name, $expirationDate);
                                Log::info("Estado atualizado com sucesso");
                            }
                        }
                    } else {
                        $total = 0;
                        $user = $itemsWithSameExpiration->first()->pedido->user;
                        $proprietario = $itemsWithSameExpiration->first()->proprietario;

                        if ($expirationDate < 45 && $expirationDate > 0) {
                            foreach ($itemsWithSameExpiration as $item) {
                                $total += $item->preco;
                            }

                            $pedido = Pedidos::create([
                                'user_id' => $user->id,
                                'total' => $total,
                                'vencimento' => $dataAtual->addYear(),
                                'categoria' => 'renovação',
                            ]);
                            $pedido->codigo = $anoAtual . '/' . $pedido->id;
                            $pedido->update();

                            foreach ($itemsWithSameExpiration as $item) {
                                $item->update(['estado' => "a expirar"]);
                                $pedido->items()->create([
                                    'servico_id' => $item->servico_id,
                                    'quantidade' => $item->quantidade,
                                    'preco' => $item->preco,
                                    'subtotal' => $item->quantidade * $item->preco,
                                    'proprietario_id' => $proprietario ? $proprietario->id : null,
                                    'domain' => $item->domain ?? 'sem dominio',
                                    'categoria' => 'renovação',
                                    'periodo' => $item->periodo,
                                    "data_activacao" => $item->data_activacao,
                                    "data_domain" => $item->data_domain,
                                    "token" => $token,
                                ]);
                            }

                            $definicoes = Definicao::first();

                            $pdf = Pdf::loadView('pdf', ['pedido' => $pedido, 'definicao' => $definicoes]);
                            $name = 'proforma_' . $pedido->id . '_' . $pedido->user->name . '_' . $pedido->created_at->format('d-m-Y') . '.pdf';
                            $pdfContent = $pdf->output();
                            Storage::put('pdfs/' . $name, $pdfContent);
                            Proforma::create([
                                'pdf' => $name,
                                'pedido_id' => $pedido->id
                            ]);
                            Cobranca::create([
                                'token' => $token,
                                'proforma' => $name,
                                'user_email' => $user->email,
                                'user_name' => $user->name,
                                'data_expiracao' => $expirationDate,
                                'utimo_aviso' => Carbon::today()
                            ]);
                            EmailJob::dispatch('AVISO DE PAGAMENTO', $user->email, $name, $user->name, $expirationDate);

                            Log::info("Estado atualizado com sucesso");
                        } elseif ($expirationDate <= 0) {
                            foreach ($itemsWithSameExpiration as $item) {
                                $total += $item->preco;
                            }

                            $pedido = Pedidos::create([
                                'user_id' => $user->id,
                                'total' => $total,
                                'vencimento' => $dataAtual->addYear(),
                                'categoria' => 'renovação',
                            ]);
                            $pedido->codigo = $anoAtual . '/' . $pedido->id;
                            $pedido->update();
                            foreach ($itemsWithSameExpiration as $item) {
                                $item->update(['estado' => "Expirado"]);
                                $pedido->items()->create([
                                    'servico_id' => $item->servico_id,
                                    'quantidade' => $item->quantidade,
                                    'preco' => $item->preco,
                                    'subtotal' => $item->quantidade * $item->preco,
                                    'proprietario_id' => $proprietario ? $proprietario->id : null,
                                    'domain' => $item->domain ?? 'sem dominio',
                                    'categoria' => 'renovação',
                                    'periodo' => $item->periodo,
                                    "data_activacao" => $item->data_activacao,
                                    "data_domain" => $item->data_domain,
                                    "token" => $token,
                                ]);
                            }
                            $definicoes = Definicao::first();

                            $pdf = Pdf::loadView('pdf', ['pedido' => $pedido, 'definicao' => $definicoes]);
                            $name = 'proforma_' . $pedido->id . '_' . $pedido->user->name . '_' . $pedido->created_at->format('d-m-Y') . '.pdf';
                            $pdfContent = $pdf->output();
                            Storage::put('pdfs/' . $name, $pdfContent);
                            Proforma::create([
                                'pdf' => $name,
                                'pedido_id' => $pedido->id
                            ]);
                            Cobranca::create([
                                'token' => $token,
                                'proforma' => $name,
                                'user_email' => $user->email,
                                'user_name' => $user->name,
                                'data_expiracao' => $expirationDate,
                                'utimo_aviso' => Carbon::today()
                            ]);
                            EndSubJob::dispatch('CANCELAMENTO DE SERVIÇOS', $user->email, $name, $user->name, $expirationDate);
                            Log::info("Estado atualizado com sucesso");
                        }
                    }
                }
            }
        } catch (\Throwable $th) {
            ds($th);
        }
    }
}
