<?php

declare(strict_types=1);

namespace ImovelZapAi\Conversations\Application\Services;

use ImovelZapAi\Conversations\Domain\Enums\MessageDirection;
use ImovelZapAi\Conversations\Infrastructure\Persistence\Eloquent\MessageModel;

final class PersonTimelineClassifier
{
    public function shouldSkipMessage(MessageModel $message): bool
    {
        $body = trim((string) ($message->body ?? ''));

        if ($body === '') {
            return true;
        }

        if (preg_match('/^Imóvel \d+ de \d+/u', $body)) {
            return true;
        }

        if (str_contains($body, 'O que deseja fazer?')) {
            return true;
        }

        if (str_contains($body, 'Gostou deste imóvel?')) {
            return true;
        }

        return false;
    }

    public function labelForMessage(MessageModel $message, bool $isBrokerPhase): ?string
    {
        $body = trim((string) ($message->body ?? ''));

        if ($body === '' || $this->shouldSkipMessage($message)) {
            return null;
        }

        if ($message->direction === MessageDirection::Inbound) {
            return $this->labelInbound($body);
        }

        if ($isBrokerPhase) {
            return 'Corretor respondeu';
        }

        if ($this->isCatalogSummary($body)) {
            $count = $this->extractCatalogCount($body);

            return $count > 0
                ? "Sistema enviou {$count} imóvel(is)"
                : 'Sistema respondeu à busca';
        }

        if (str_contains($body, 'Vou passar suas informações para um corretor')) {
            return 'Assistente encaminhou ao corretor';
        }

        return 'Assistente respondeu';
    }

    private function labelInbound(string $body): string
    {
        $normalized = mb_strtolower($body);

        if (preg_match('/\b(quero visitar|visitar)\b/u', $normalized)) {
            return 'Cliente solicitou visita';
        }

        if (preg_match('/\b(alugar|aluguel|comprar|compra|apartamento|casa|imóvel|imovel|kitnet|studio|cobertura)\b/u', $normalized)) {
            return 'Cliente pediu imóvel';
        }

        if (preg_match('/^(oi|olá|ola|bom dia|boa tarde|boa noite)\b/u', $normalized)) {
            return 'Cliente cumprimentou';
        }

        if (preg_match('/^(sim|s|ok|mais|visitar)$/u', $normalized)) {
            return 'Cliente respondeu no catálogo';
        }

        return 'Cliente enviou mensagem';
    }

    private function isCatalogSummary(string $body): bool
    {
        return (bool) preg_match('/\bachei\b/u', mb_strtolower($body))
            || str_contains($body, 'Encontrei');
    }

    private function extractCatalogCount(string $body): int
    {
        if (preg_match('/(?:Encontrei|achei) \*(\d+) imóv/i', $body, $matches)) {
            return max(1, (int) $matches[1]);
        }

        if (preg_match('/achei \*1 imóvel\*/i', $body) || preg_match('/achei \*1 opção\*/i', $body)) {
            return 1;
        }

        if (str_contains(mb_strtolower($body), 'achei')) {
            return 1;
        }

        return 0;
    }
}
