package pl.polskalokalnie.mailconfig;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pl.polskalokalnie.send.EmailSender;
import pl.polskalokalnie.send.SendResult;
import pl.polskalokalnie.send.SmsSender;

/**
 * Konfiguracja poczty SMTP i bramki SMS w panelu administratora oraz kontrolowana wysylka testowa
 * do pojedynczego odbiorcy. Sekrety nigdy nie sa zwracane - w odpowiedzi jedynie flaga "ustawione".
 */
@RestController
@RequestMapping("/api/admin/mail-config")
public class MailConfigController {

    private final MailConfigService mailConfigService;
    private final EmailSender emailSender;
    private final SmsSender smsSender;

    public MailConfigController(MailConfigService mailConfigService, EmailSender emailSender, SmsSender smsSender) {
        this.mailConfigService = mailConfigService;
        this.emailSender = emailSender;
        this.smsSender = smsSender;
    }

    @GetMapping("/smtp")
    public SmtpConfigResponse getSmtp() {
        return SmtpConfigResponse.from(mailConfigService.getSmtp());
    }

    @PutMapping("/smtp")
    public SmtpConfigResponse updateSmtp(@RequestBody SmtpConfigRequest request) {
        return SmtpConfigResponse.from(mailConfigService.updateSmtp(request));
    }

    @GetMapping("/sms")
    public SmsConfigResponse getSms() {
        return SmsConfigResponse.from(mailConfigService.getSms());
    }

    @PutMapping("/sms")
    public SmsConfigResponse updateSms(@RequestBody SmsConfigRequest request) {
        return SmsConfigResponse.from(mailConfigService.updateSms(request));
    }

    @PostMapping("/smtp/test")
    public TestResultResponse testSmtp(@Valid @RequestBody TestSendRequest request) {
        SendResult result = emailSender.send(
                mailConfigService.getSmtp(),
                request.recipient().trim(),
                "Test konfiguracji SMTP – Polska Lokalnie",
                "<p>To jest wiadomość testowa potwierdzająca poprawną konfigurację poczty SMTP.</p>");
        return TestResultResponse.from(result);
    }

    @PostMapping("/sms/test")
    public TestResultResponse testSms(@Valid @RequestBody TestSendRequest request) {
        SendResult result = smsSender.send(
                mailConfigService.getSms(),
                request.recipient().trim(),
                "Test konfiguracji bramki SMS – Polska Lokalnie");
        return TestResultResponse.from(result);
    }

    public record TestSendRequest(@NotBlank String recipient) {
    }

    public record TestResultResponse(boolean ok, String providerMessageId, String error) {
        static TestResultResponse from(SendResult result) {
            return new TestResultResponse(result.ok(), result.providerMessageId(), result.error());
        }
    }
}
