package de.oaa.xxx.feedback;

import de.oaa.xxx.mail.Email;
import de.oaa.xxx.mail.MailService;
import de.oaa.xxx.support.SupportUserService;
import de.oaa.xxx.user.UserRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.security.Principal;
import java.time.LocalDateTime;
import java.util.UUID;

@RestController
@RequestMapping("/api/feedback")
public class FeedbackController {

    private final MailService mailService;
    private final FeedbackRepository feedbackRepository;
    private final UserRepository userRepository;
    private final SupportUserService supportUserService;

    public FeedbackController(MailService mailService,
                              FeedbackRepository feedbackRepository,
                              UserRepository userRepository,
                              SupportUserService supportUserService) {
        this.mailService = mailService;
        this.feedbackRepository = feedbackRepository;
        this.userRepository = userRepository;
        this.supportUserService = supportUserService;
    }

    record FeedbackRequest(String name, String seite, String grund, String text) {}

    @PostMapping
    public ResponseEntity<Void> send(@RequestBody FeedbackRequest req, Principal principal) {
        if (req.text() == null || req.text().isBlank() || req.text().length() < 10 || req.text().length() > 1000) {
            return ResponseEntity.badRequest().build();
        }

        // Eingeloggten User ermitteln (optional)
        UUID userId = null;
        if (principal != null) {
            userId = userRepository.findByEmail(principal.getName())
                    .map(u -> u.getUserId()).orElse(null);
        }

        FeedbackEntity entity = new FeedbackEntity();
        entity.setUserId(userId);
        entity.setName(req.name());
        entity.setSeite(req.seite());
        entity.setGrund(req.grund());
        entity.setText(req.text());
        entity.setEingegangen(LocalDateTime.now());
        entity.setStatus(FeedbackStatus.UNGELESEN);
        feedbackRepository.save(entity);

        // Bestätigungs-DM an eingeloggten Nutzer
        if (userId != null) {
            supportUserService.sendDm(userId,
                "Vielen Dank für dein Feedback! ✉️\n\n" +
                "Wir haben deine Nachricht erhalten und werden uns so schnell wie möglich darum kümmern.\n\n" +
                "Bitte antworte nicht auf diese Nachricht – du kannst uns jederzeit über " +
                "Kontakt & Feedback erneut erreichen.");
        }

        try {
            Email email = new Email();
            email.setEmailAdresse("kontakt@xxx-sphere.de");
            email.setTitel("[xXx Sphere] " + esc(req.grund()));
            email.setText(
                "<b>Von:</b> " + esc(req.name()) + "<br>" +
                "<b>Seite:</b> " + esc(req.seite()) + "<br>" +
                "<b>Grund:</b> " + esc(req.grund()) + "<br><br>" +
                "<b>Nachricht:</b><br>" + esc(req.text()).replace("\n", "<br>")
            );
            mailService.send(email);
        } catch (Exception e) {
            // Mail-Server nicht erreichbar – Eintrag ist bereits gespeichert
        }

        return ResponseEntity.ok().build();
    }

    private String esc(String s) {
        if (s == null) return "";
        return s.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
    }
}
