<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use DateTime;
use App\Models\Abandonos;
use App\Models\N8n;

class WebHookN8nAbandonos extends Command
{
    protected $signature = 'WebHookN8nAbandonos';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        if ($cron = cronRodar('WebHookN8nAbandonos')) {

            // Fetch active n8n configurations
            $activeConfigs = N8n::where('ativo', 'S')->where('evento', 'abandono_gerado')->get();

            foreach ($activeConfigs as $config) {
                $id_empresa = $config->id_empresa;
                $id_loja = $config->id_loja;

                $pedidos_created_at = now()->subDays(7)->toDateTimeString();
                $abandono_sessao_created_at_min = now()->subDays(700)->subMinutes(70)->toDateTimeString();
                $abandono_sessao_created_at_max = now()->subMinutes(10)->toDateTimeString();

                $select = "
                SELECT
                abandono_sessao.*
                FROM abandono_sessao
                LEFT JOIN clientes ON clientes.telefone = abandono_sessao.telefone AND clientes.id_empresa = abandono_sessao.id_empresa
                JOIN kits ON kits.id = abandono_sessao.id_produto
                LEFT JOIN pedidos ON pedidos.id_cliente = clientes.id
                    AND pedidos.id_empresa = abandono_sessao.id_empresa
                    AND (
                            pedidos.id_kit_maior_valor = abandono_sessao.id_produto
                            OR pedidos.id_curso = abandono_sessao.id_produto
                        )
                    AND abandono_sessao.id_produto IS NOT NULL
                    AND pedidos.created_at > '{$pedidos_created_at}'
                WHERE
                pedidos.id IS NULL
                AND abandono_sessao.id_empresa = $id_empresa
                AND kits.loja = $id_loja
                AND abandono_sessao.loja_virtual = 'N'
                AND abandono_sessao.created_at > '{$abandono_sessao_created_at_min}'
                AND abandono_sessao.created_at < '{$abandono_sessao_created_at_max}'
                AND abandono_sessao.funil_enviado = 'N'
                AND abandono_sessao.telefone IS NOT NULL
                GROUP BY
                abandono_sessao.id,
                abandono_sessao.telefone,
                abandono_sessao.nome,
                abandono_sessao.id_empresa,
                abandono_sessao.id_produto";

                foreach (DB::select($select) as $abandono) {

                    dd($abandono);

                    try {
                        $valor = Kits::find($abandono->id_produto);
                        $valor = $valor->preco;
                    } catch (\Throwable $th) {
                        $valor = 0;
                    }

                    $celular = $this->arrumaCelular($abandono->telefone);

                    $data = [
                        'type' => 'AddToCart',
                        'event_time' => time(),
                        'name' => $abandono->nome,
                        'email' => $abandono->email,
                        'phone' => "+55" . $celular,
                        'pageUrl' => $abandono->url_origem ?? "https://paybuy.digital/",
                        'custom_data' => [
                            'currency' => 'BRL',
                            'value' => $valor
                        ],
                    ];

                    $headers = [
                        'x-real-ip' => substr($abandono->sessao_key, 14),
                        'user-agent' => getRandomUserAgent()
                    ];

                    $webhookUrl = 'https://n8n.ckoutzap.com/webhook-test/60e682c3-da03-477a-8aab-f8b793b2ad03';

                    try {
                        $response = Http::withHeaders($headers)->post($webhookUrl, $data);

                        if ($response->successful()) {
                            dump('Dados enviados com sucesso!', ['data' => $data]);
                        } else {
                            dump('Erro ao enviar dados.', [
                                'status' => $response->status(),
                                'response' => $response->body()
                            ]);
                        }
                    } catch (\Exception $e) {
                        dump('Falha na requisição HTTP.', ['error' => $e->getMessage()]);
                    }

                    $abandonoModel = Abandonos::find($abandono->id);
                    if ($abandonoModel) {
                        $abandonoModel->funil_enviado = 'S';
                        $abandonoModel->save();
                    }
                }
            }

            cronRodou($cron);
        }
    }
}