package com.unicorn.hgzero.notification.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.util.Map;

/**
 * 이메일 템플릿 렌더링 서비스
 *
 * Thymeleaf 템플릿 엔진을 사용하여 동적 HTML 이메일 생성
 * 회의 초대, Todo 할당 등 다양한 알림 템플릿 지원
 *
 * @author 준호 (Backend Developer)
 * @version 1.0
 * @since 2025-10-23
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class EmailTemplateService {

    private final TemplateEngine templateEngine;

    /**
     * 회의 초대 이메일 템플릿 렌더링
     *
     * @param variables 템플릿 변수 맵
     *                  - title: 회의 제목
     *                  - description: 회의 설명
     *                  - startTime: 시작 시간
     *                  - endTime: 종료 시간
     *                  - location: 장소
     *                  - organizerName: 주최자 이름
     *                  - participantName: 참석자 이름
     * @return 렌더링된 HTML 문자열
     */
    public String renderMeetingInvitation(Map<String, Object> variables) {
        try {
            log.info("회의 초대 템플릿 렌더링 시작");

            Context context = new Context();
            context.setVariables(variables);

            String html = templateEngine.process("meeting-invitation", context);

            log.info("회의 초대 템플릿 렌더링 완료");
            return html;

        } catch (Exception e) {
            log.error("회의 초대 템플릿 렌더링 실패", e);
            throw new RuntimeException("템플릿 렌더링 실패: meeting-invitation", e);
        }
    }

    /**
     * Todo 할당 이메일 템플릿 렌더링
     *
     * @param variables 템플릿 변수 맵
     *                  - title: Todo 제목
     *                  - description: Todo 설명
     *                  - deadline: 마감 기한
     *                  - priority: 우선순위
     *                  - assignedByName: 할당자 이름
     *                  - assigneeName: 담당자 이름
     *                  - meetingTitle: 관련 회의 제목 (optional)
     * @return 렌더링된 HTML 문자열
     */
    public String renderTodoAssigned(Map<String, Object> variables) {
        try {
            log.info("Todo 할당 템플릿 렌더링 시작");

            Context context = new Context();
            context.setVariables(variables);

            String html = templateEngine.process("todo-assigned", context);

            log.info("Todo 할당 템플릿 렌더링 완료");
            return html;

        } catch (Exception e) {
            log.error("Todo 할당 템플릿 렌더링 실패", e);
            throw new RuntimeException("템플릿 렌더링 실패: todo-assigned", e);
        }
    }

    /**
     * 리마인더 이메일 템플릿 렌더링
     *
     * @param variables 템플릿 변수 맵
     *                  - reminderType: 리마인더 유형 (meeting, todo)
     *                  - title: 제목
     *                  - description: 설명
     *                  - scheduledTime: 예정 시간
     *                  - recipientName: 수신자 이름
     * @return 렌더링된 HTML 문자열
     */
    public String renderReminder(Map<String, Object> variables) {
        try {
            log.info("리마인더 템플릿 렌더링 시작");

            Context context = new Context();
            context.setVariables(variables);

            String html = templateEngine.process("reminder", context);

            log.info("리마인더 템플릿 렌더링 완료");
            return html;

        } catch (Exception e) {
            log.error("리마인더 템플릿 렌더링 실패", e);
            throw new RuntimeException("템플릿 렌더링 실패: reminder", e);
        }
    }

    /**
     * 일반 템플릿 렌더링
     *
     * @param templateName 템플릿 이름 (확장자 제외)
     * @param variables 템플릿 변수 맵
     * @return 렌더링된 HTML 문자열
     */
    public String render(String templateName, Map<String, Object> variables) {
        try {
            log.info("템플릿 렌더링 시작 - Template: {}", templateName);

            Context context = new Context();
            context.setVariables(variables);

            String html = templateEngine.process(templateName, context);

            log.info("템플릿 렌더링 완료 - Template: {}", templateName);
            return html;

        } catch (Exception e) {
            log.error("템플릿 렌더링 실패 - Template: {}", templateName, e);
            throw new RuntimeException("템플릿 렌더링 실패: " + templateName, e);
        }
    }
}
