<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
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')) {

            $activeConfigs = N8n::where('ativo', 'S')
            ->where('evento', 'abandono_gerado')
            ->whereNotNull('appId')
            ->whereNotNull('accessToken')
            ->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()->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.n8n_enviado IS NULL
                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) {

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

                    $celular = arrumaCelular($abandono->telefone);
                    $email = $abandono->email ?? 'abandono@paybuy.digital';
                    $nome = $abandono->nome ?? 'Abandono';
                    $formataNomeSobrenomes = formataNomeSobrenomes($nome);
                    $firstName = $formataNomeSobrenomes['firstname'];
                    $lastName = $formataNomeSobrenomes['lastname'];

                    $emailHash = hash('sha256', strtolower(trim($email)));
                    $phoneHash = hash('sha256', preg_replace('/[^0-9]/', '', $celular));
                    $firstNameHash = hash('sha256', strtolower(trim($firstName)));
                    $lastNameHash = hash('sha256', strtolower(trim($lastName)));
                    $genderHash = hash('sha256', strtolower('m'));
                    $cityHash = hash('sha256', strtolower(trim($abandono->cidade)));
                    $regionHash = hash('sha256', strtolower(trim($abandono->uf)));
                    $zipHash = hash('sha256', strtolower(trim($abandono->cep)));
                    $countryHash = hash('sha256', strtolower(trim('Brasil')));

                    $eventTime = time();
                    $eventId = rand(100000000, 999999999);

                    $subdomainIndex = 1;
                    $creationTime = round(microtime(true) * 1000);
                    $randomNumber = rand(1000000000, 9999999999);
                    $fbp = "fb.$subdomainIndex.$creationTime.$randomNumber";

                    $data = [
                        'type' => 'AddToCart',
                        'event_time' => $eventTime,
                        'event_id' => $eventId,
                        'pageUrl' => $abandono->url_origem ?? "https://paybuy.digital/",
                        'fbc' => null,
                        'fbp' => $fbp,
                        'cityHash' => $cityHash,
                        'regionHash' => $regionHash,
                        'zipHash' => $zipHash,
                        'countryHash' => $countryHash,
                        'emailHash' => $emailHash,
                        'phoneHash' => $phoneHash,
                        'first_nameHash' => $firstNameHash,
                        'last_nameHash' => $lastNameHash,
                        'genderHash' => $genderHash,
                        'appId' => $config->appId,
                        'accessToken' => $config->accessToken,
                        'custom_data' => [
                            'currency' => 'BRL',
                            'value' => $valor
                        ],
                    ];

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

                    $webhookUrl = 'https://n8n.ckoutzap.com/webhook/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->n8n_enviado = 'S';
                        $abandonoModel->save();
                    }
                }
            }

            cronRodou($cron);
        }
    }
}