package com.samsung.sample.mail.controller;

import com.samsung.knox.mail.dto.MailDto;
import com.samsung.knox.mail.dto.RecipientDto;
import com.samsung.knox.mail.dto.SenderDto;
import com.samsung.knox.mail.enums.ContentType;
import com.samsung.knox.mail.enums.RecipientType;
import com.samsung.knox.mail.vo.SendMail;
import com.samsung.knox.user.KnoxUserService;
import com.samsung.knox.user.entity.Employee;
import com.samsung.mail.EmailService;
import com.samsung.resource.FileManagerService;
import com.samsung.resource.entity.AttachFile;
import com.samsung.template.enums.TemplateEngineType;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@Log4j2
public class MailSampleController {

    private final EmailService mailService;

    private final MessageSourceAccessor messageSourceAccessor;

    private final FileManagerService fileManagerService;

    private final KnoxUserService knoxUserService;

    public MailSampleController(EmailService mailService, MessageSourceAccessor messageSourceAccessor, FileManagerService fileManagerService, KnoxUserService knoxUserService) {
        this.mailService = mailService;
        this.messageSourceAccessor = messageSourceAccessor;
        this.fileManagerService = fileManagerService;
        this.knoxUserService = knoxUserService;
    }

    @Operation(summary = "샘플 메일 테스트 (코드 참조)")
    @PostMapping("/sample/mails/send-mht")
    public void sampleMailMht() {
        // 수신자 정보 (필수)
        List<RecipientDto> recipients = new ArrayList<>();
        recipients.add(new RecipientDto("mt.kwon@stage.partner.samsung.com", RecipientType.TO.name()));
        recipients.add(new RecipientDto("jungah.jee@stage.samsung.com", RecipientType.CC.name()));

        // 발신 메일 Body
        Employee[] employees = knoxUserService.getKnoxEmployeesByKnoxId("bbnydory.kim");
        SenderDto sender = new SenderDto(employees[0].getEmailAddress());   // "bbnydory.kim@stage.samsung.com"
        MailDto mailDto = new MailDto("메일 발송 테스트입니다. v2 - by Template Key", sender, recipients);

        // 보안메일 여부 설정 (보안메일의 경우 drmOption 필수)
//        mailDto.setDocSecuType(DocSecuType.CONFIDENTIAL.name());
//        DrmOptionDto drmOption = DrmOptionDto.builder().build();
//        mailDto.setDrmOption(drmOption);

        // 첨부파일 (선택)
        // 보안메일의 경우 txt, doc, ppt, xls, pdf, jpg, jpeg, gif, bmp, docx, pptx, xlsx, mht, gul 확장자만 허용
        List<AttachFile> attachments = fileManagerService.getAttachFileList("AXDSZHDaANzwk_qR", null);

        // 발신 메일 정보
        SendMail sendMail = new SendMail("bbnydory.kim");
        sendMail.setMailDto(mailDto);
        sendMail.setAttachments(attachments);
//        sendMail.setNotStoredInDB(true);   // 메일 본문을 DB에 저장하지 않을 경우에만 설정 (메일 발송이 많은 사이트는 DB 사용량 등 고려)

        // 메일 본문 Template
        Map<String, Object> templateVars = new HashMap<>();
        templateVars.put("title", "메일 템플릿 제목");
        templateVars.put("item1", "메일 템플릿 항목1");
        templateVars.put("messages", messageSourceAccessor);

        String mailId = mailService.sendMailByTemplate("templates/mail/mail-sample.vm", templateVars, TemplateEngineType.VELOCITY, ContentType.MIME, sendMail);
//        String mailId = mailService.sendMailByTemplateKey("MAILTEMPLATE01", templateVars, TemplateEngineType.THYMELEAF, ContentType.MIME, sendMail);
        log.debug("Mail ID: {}", mailId);
    }
}
