/**
 * 메일 수신 컨트롤러 (Step 2 - 기본 구현)
 */

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

export class MailReceiveBasicController {
  private mailReceiveService: MailReceiveBasicService;

  constructor() {
    this.mailReceiveService = new MailReceiveBasicService();
  }

  /**
   * GET /api/mail/receive/:accountId
   * 메일 목록 조회
   */
  async getMailList(req: Request, res: Response) {
    try {
      // console.log('📬 메일 목록 조회 요청:', {
      //   params: req.params,
      //   path: req.path,
      //   originalUrl: req.originalUrl
      // });
      
      const { accountId } = req.params;
      const limit = parseInt(req.query.limit as string) || 50;

      const mails = await this.mailReceiveService.fetchMailList(accountId, limit);

      return res.status(200).json({
        success: true,
        data: mails,
        count: mails.length,
      });
    } catch (error: unknown) {
      console.error('메일 목록 조회 실패:', error);
      return res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '메일 목록 조회 실패',
      });
    }
  }

  /**
   * GET /api/mail/receive/:accountId/:seqno
   * 메일 상세 조회
   */
  async getMailDetail(req: Request, res: Response) {
    try {
      // console.log('🔍 메일 상세 조회 요청:', {
      //   params: req.params,
      //   path: req.path,
      //   originalUrl: req.originalUrl
      // });
      
      const { accountId, seqno } = req.params;
      const seqnoNumber = parseInt(seqno, 10);

      if (isNaN(seqnoNumber)) {
        return res.status(400).json({
          success: false,
          message: '유효하지 않은 메일 번호입니다.',
        });
      }

      const mailDetail = await this.mailReceiveService.getMailDetail(accountId, seqnoNumber);

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

      return res.status(200).json({
        success: true,
        data: mailDetail,
      });
    } catch (error: unknown) {
      console.error('메일 상세 조회 실패:', error);
      return res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '메일 상세 조회 실패',
      });
    }
  }

  /**
   * POST /api/mail/receive/:accountId/:seqno/mark-read
   * 메일을 읽음으로 표시
   */
  async markAsRead(req: Request, res: Response) {
    try {
      const { accountId, seqno } = req.params;
      const seqnoNumber = parseInt(seqno, 10);

      if (isNaN(seqnoNumber)) {
        return res.status(400).json({
          success: false,
          message: '유효하지 않은 메일 번호입니다.',
        });
      }

      const result = await this.mailReceiveService.markAsRead(accountId, seqnoNumber);

      return res.status(200).json(result);
    } catch (error: unknown) {
      console.error('읽음 표시 실패:', error);
      return res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '읽음 표시 실패',
      });
    }
  }

  /**
   * GET /api/mail/receive/:accountId/:seqno/attachment/:index
   * 첨부파일 다운로드
   */
  async downloadAttachment(req: Request, res: Response) {
    try {
      // console.log('📎🎯 컨트롤러 downloadAttachment 진입');
      const { accountId, seqno, index } = req.params;
      // console.log(`📎 파라미터: accountId=${accountId}, seqno=${seqno}, index=${index}`);
      
      const seqnoNumber = parseInt(seqno, 10);
      const indexNumber = parseInt(index, 10);

      if (isNaN(seqnoNumber) || isNaN(indexNumber)) {
        // console.log('❌ 유효하지 않은 파라미터');
        return res.status(400).json({
          success: false,
          message: '유효하지 않은 파라미터입니다.',
        });
      }

      // console.log('📎 서비스 호출 시작...');
      const result = await this.mailReceiveService.downloadAttachment(
        accountId,
        seqnoNumber,
        indexNumber
      );
      // console.log(`📎 서비스 호출 완료: result=${result ? '있음' : '없음'}`);

      if (!result) {
        // console.log('❌ 첨부파일을 찾을 수 없음');
        return res.status(404).json({
          success: false,
          message: '첨부파일을 찾을 수 없습니다.',
        });
      }
      
      // console.log(`📎 파일 다운로드 시작: ${result.filename}`);
      // console.log(`📎 파일 경로: ${result.filePath}`);

      // 파일 다운로드
      res.download(result.filePath, result.filename, (err) => {
        if (err) {
          console.error('파일 다운로드 오류:', err);
          if (!res.headersSent) {
            res.status(500).json({
              success: false,
              message: '파일 다운로드 실패',
            });
          }
        }
      });
      return; // void 반환
    } catch (error: unknown) {
      console.error('첨부파일 다운로드 실패:', error);
      return res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '첨부파일 다운로드 실패',
      });
    }
  }

  /**
   * POST /api/mail/receive/:accountId/test-imap
   * IMAP 연결 테스트
   */
  async testImapConnection(req: Request, res: Response) {
    try {
      const { accountId } = req.params;

      const result = await this.mailReceiveService.testImapConnection(accountId);

      return res.status(result.success ? 200 : 400).json(result);
    } catch (error: unknown) {
      return res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : 'IMAP 연결 테스트 실패',
      });
    }
  }

  /**
   * GET /api/mail/receive/today-count
   * 오늘 수신 메일 수 조회
   */
  async getTodayReceivedCount(req: Request, res: Response) {
    try {
      const { accountId } = req.query;
      const count = await this.mailReceiveService.getTodayReceivedCount(accountId as string);
      
      return res.json({
        success: true,
        data: { count }
      });
    } catch (error: unknown) {
      console.error('오늘 수신 메일 수 조회 실패:', error);
      return res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '오늘 수신 메일 수 조회에 실패했습니다.'
      });
    }
  }

  /**
   * DELETE /api/mail/receive/:accountId/:seqno
   * IMAP 서버에서 메일 삭제
   */
  async deleteMail(req: Request, res: Response) {
    try {
      const { accountId, seqno } = req.params;
      const seqnoNumber = parseInt(seqno, 10);

      if (isNaN(seqnoNumber)) {
        return res.status(400).json({
          success: false,
          message: '유효하지 않은 메일 번호입니다.',
        });
      }

      const result = await this.mailReceiveService.deleteMail(accountId, seqnoNumber);

      return res.status(200).json(result);
    } catch (error: unknown) {
      console.error('메일 삭제 실패:', error);
      return res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '메일 삭제 실패',
      });
    }
  }
}


export const mailReceiveBasicController = new MailReceiveBasicController();
