import { Request, Response } from 'express';
import { mailTemplateFileService } from '../services/mailTemplateFileService';

// 간단한 변수 치환 함수
function replaceVariables(text: string, data: Record<string, any>): string {
  let result = text;
  for (const [key, value] of Object.entries(data)) {
    const regex = new RegExp(`\\{${key}\\}`, 'g');
    result = result.replace(regex, String(value));
  }
  return result;
}

export class MailTemplateFileController {
  // 모든 템플릿 조회
  async getAllTemplates(req: Request, res: Response) {
    try {
      const { category, search } = req.query;

      let templates;
      if (search) {
        templates = await mailTemplateFileService.searchTemplates(search as string);
      } else if (category) {
        templates = await mailTemplateFileService.getTemplatesByCategory(category as string);
      } else {
        templates = await mailTemplateFileService.getAllTemplates();
      }

      return res.json({
        success: true,
        data: templates,
        total: templates.length,
      });
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '템플릿 조회 실패',
        error: err.message,
      });
    }
  }

  // 특정 템플릿 조회
  async getTemplateById(req: Request, res: Response) {
    try {
      const { id } = req.params;
      const template = await mailTemplateFileService.getTemplateById(id);

      if (!template) {
        return res.status(404).json({
          success: false,
          message: '템플릿을 찾을 수 없습니다.',
        });
      }

      return res.json({
        success: true,
        data: template,
      });
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '템플릿 조회 실패',
        error: err.message,
      });
    }
  }

  // 템플릿 생성
  async createTemplate(req: Request, res: Response) {
    try {
      const { name, subject, components, queryConfig, recipientConfig, category } = req.body;

      if (!name || !subject || !Array.isArray(components)) {
        return res.status(400).json({
          success: false,
          message: '템플릿 이름, 제목, 컴포넌트가 필요합니다.',
        });
      }

      const template = await mailTemplateFileService.createTemplate({
        name,
        subject,
        components,
        queryConfig,
        recipientConfig,
        category,
      });

      return res.status(201).json({
        success: true,
        data: template,
        message: '템플릿이 생성되었습니다.',
      });
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '템플릿 생성 실패',
        error: err.message,
      });
    }
  }

  // 템플릿 수정
  async updateTemplate(req: Request, res: Response) {
    try {
      const { id } = req.params;
      const updates = req.body;

      const template = await mailTemplateFileService.updateTemplate(id, updates);

      if (!template) {
        return res.status(404).json({
          success: false,
          message: '템플릿을 찾을 수 없습니다.',
        });
      }

      return res.json({
        success: true,
        data: template,
        message: '템플릿이 수정되었습니다.',
      });
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '템플릿 수정 실패',
        error: err.message,
      });
    }
  }

  // 템플릿 삭제
  async deleteTemplate(req: Request, res: Response) {
    try {
      const { id } = req.params;
      const success = await mailTemplateFileService.deleteTemplate(id);

      if (!success) {
        return res.status(404).json({
          success: false,
          message: '템플릿을 찾을 수 없습니다.',
        });
      }

      return res.json({
        success: true,
        message: '템플릿이 삭제되었습니다.',
      });
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '템플릿 삭제 실패',
        error: err.message,
      });
    }
  }

  // 템플릿 미리보기 (HTML 렌더링)
  async previewTemplate(req: Request, res: Response) {
    try {
      const { id } = req.params;
      const { sampleData } = req.body;

      const template = await mailTemplateFileService.getTemplateById(id);
      if (!template) {
        return res.status(404).json({
          success: false,
          message: '템플릿을 찾을 수 없습니다.',
        });
      }

      // HTML 렌더링
      let html = mailTemplateFileService.renderTemplateToHtml(template.components);
      let subject = template.subject;

      // 샘플 데이터가 있으면 변수 치환
      if (sampleData) {
        html = replaceVariables(html, sampleData);
        subject = replaceVariables(subject, sampleData);
      }

      return res.json({
        success: true,
        data: {
          subject,
          html,
          sampleData,
        },
      });
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '미리보기 생성 실패',
        error: err.message,
      });
    }
  }

  // 템플릿 + 쿼리 통합 미리보기
  async previewWithQuery(req: Request, res: Response) {
    try {
      const { id } = req.params;
      const { queryId, parameters } = req.body;

      const template = await mailTemplateFileService.getTemplateById(id);
      if (!template) {
        return res.status(404).json({
          success: false,
          message: '템플릿을 찾을 수 없습니다.',
        });
      }

      // 쿼리 실행
      const query = template.queryConfig?.queries.find(q => q.id === queryId);
      if (!query) {
        return res.status(404).json({
          success: false,
          message: '쿼리를 찾을 수 없습니다.',
        });
      }

      // SQL 쿼리 기능은 구현되지 않음
      return res.status(501).json({
        success: false,
        message: 'SQL 쿼리 연동 기능은 현재 지원하지 않습니다.',
      });
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '쿼리 미리보기 실패',
        error: err.message,
      });
    }
  }
}

export const mailTemplateFileController = new MailTemplateFileController();

