package pl.polskalokalnie.lead;

import java.util.Locale;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pl.polskalokalnie.user.AppUser;

/**
 * Utrzymuje leady typu REGISTERED_USER w zgodzie z kontami uzytkownikow. Wolane przy rejestracji
 * i aktualizacji profilu oraz przez backfill przy starcie aplikacji. Zgody marketingowe (mail/SMS)
 * uzytkownika przechowujemy na jego leadzie - to jedno zrodlo prawdy dla kwalifikacji do kampanii.
 */
@Service
public class LeadSyncService {

    private final LeadRepository leadRepository;

    public LeadSyncService(LeadRepository leadRepository) {
        this.leadRepository = leadRepository;
    }

    @Transactional
    public Lead syncUser(AppUser user) {
        if (user == null || user.getId() == null) {
            return null;
        }
        Lead lead = leadRepository.findByUserId(user.getId())
                .orElseGet(() -> leadRepository.findFirstByEmailIgnoreCase(user.getEmail()).orElseGet(Lead::new));

        lead.setSource(LeadSource.REGISTERED_USER);
        lead.setUserId(user.getId());
        lead.setName(user.getFullName());
        lead.setEmail(user.getEmail() == null ? null : user.getEmail().toLowerCase(Locale.ROOT));
        lead.setPhone(normalizePhone(user.getPhone()));
        return leadRepository.save(lead);
    }

    /**
     * Zwraca lead powiazany z uzytkownikiem, tworzac go w razie potrzeby - uzywane przez ekran
     * zgod marketingowych uzytkownika.
     */
    @Transactional
    public Lead getOrCreateForUser(AppUser user) {
        Lead lead = leadRepository.findByUserId(user.getId()).orElse(null);
        return lead != null ? lead : syncUser(user);
    }

    @Transactional
    public Lead updateConsentForUser(AppUser user, boolean emailConsent, boolean smsConsent) {
        Lead lead = getOrCreateForUser(user);
        lead.setEmailConsent(emailConsent);
        lead.setSmsConsent(smsConsent);
        return leadRepository.save(lead);
    }

    private static String normalizePhone(String phone) {
        if (phone == null) {
            return null;
        }
        String cleaned = phone.replaceAll("[\\s\\-()]", "").trim();
        return cleaned.isEmpty() ? null : cleaned;
    }
}
