package pl.polskalokalnie.send;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import pl.polskalokalnie.unsubscribe.UnsubscribeService;

/**
 * Sklada finalna tresc wiadomosci: personalizacja znacznikow ({{name}}) oraz obowiazkowa stopka z
 * linkiem rezygnacji. Kazda wiadomosc marketingowa musi umozliwiac wypisanie sie - link generuje
 * podpisany token per lead i kanal.
 */
@Component
public class MessageComposer {

    private final UnsubscribeService unsubscribeService;
    private final String baseUrl;

    public MessageComposer(UnsubscribeService unsubscribeService,
            @Value("${app.public-base-url:http://localhost}") String baseUrl) {
        this.unsubscribeService = unsubscribeService;
        this.baseUrl = baseUrl == null ? "" : baseUrl.replaceAll("/+$", "");
    }

    /** Tresc HTML e-maila z personalizacja i stopka rezygnacji. */
    public String composeEmail(String rawBody, String recipientName, Long leadId) {
        String personalized = personalize(rawBody, recipientName);
        String html = looksLikeHtml(personalized) ? personalized : textToHtml(personalized);
        String link = unsubscribeLink(leadId, "email");
        String footer = "<hr style=\"margin-top:24px;border:none;border-top:1px solid #e2e8f0\">"
                + "<p style=\"font-size:12px;color:#94a3b8;line-height:1.5\">"
                + "Otrzymujesz tę wiadomość, ponieważ wyraziłeś zgodę na kontakt marketingowy. "
                + "<a href=\"" + link + "\" style=\"color:#94a3b8\">Zrezygnuj z otrzymywania wiadomości</a>.</p>";
        return "<div style=\"font-family:system-ui,Segoe UI,Arial,sans-serif;color:#0f172a;font-size:15px;"
                + "line-height:1.6\">" + html + footer + "</div>";
    }

    /** Tresc SMS z personalizacja i krotka informacja o rezygnacji. */
    public String composeSms(String rawBody, String recipientName, Long leadId) {
        String personalized = personalize(rawBody, recipientName).trim();
        String link = unsubscribeLink(leadId, "sms");
        return personalized + "\nRezygnacja: " + link;
    }

    private String unsubscribeLink(Long leadId, String channel) {
        return baseUrl + "/api/unsubscribe?token=" + unsubscribeService.generateToken(leadId, channel);
    }

    private static String personalize(String body, String recipientName) {
        String name = recipientName == null || recipientName.isBlank() ? "" : recipientName.trim();
        String value = body == null ? "" : body;
        // {{name}} -> imie/nazwa; gdy brak, usuwamy podwojne spacje po podstawieniu pustej wartosci.
        return value.replace("{{name}}", name).replace("{{ name }}", name);
    }

    private static boolean looksLikeHtml(String value) {
        return value != null && value.contains("<") && value.contains(">");
    }

    private static String textToHtml(String text) {
        return escapeHtml(text).replace("\r\n", "\n").replace("\n", "<br>");
    }

    private static String escapeHtml(String value) {
        return value
                .replace("&", "&amp;")
                .replace("<", "&lt;")
                .replace(">", "&gt;");
    }
}
