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

export class MailAccountFileController {
  async getAllAccounts(req: Request, res: Response) {
    try {
      const accounts = await mailAccountFileService.getAllAccounts();
      
      // 비밀번호는 반환하지 않음
      const safeAccounts = accounts.map(({ smtpPassword, ...account }) => account);

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

  async getAccountById(req: Request, res: Response) {
    try {
      const { id } = req.params;
      const account = await mailAccountFileService.getAccountById(id);

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

      // 비밀번호는 마스킹 처리
      const { smtpPassword, ...safeAccount } = account;

      return res.json({
        success: true,
        data: {
          ...safeAccount,
          smtpPassword: '••••••••', // 마스킹
        },
      });
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '계정 조회 실패',
        error: err.message,
      });
    }
  }

  async createAccount(req: Request, res: Response) {
    try {
      const {
        name,
        email,
        smtpHost,
        smtpPort,
        smtpSecure,
        smtpUsername,
        smtpPassword,
        dailyLimit,
        status,
      } = req.body;

      if (!name || !email || !smtpHost || !smtpPort || !smtpUsername || !smtpPassword) {
        return res.status(400).json({
          success: false,
          message: '필수 필드가 누락되었습니다.',
        });
      }

      // 이메일 중복 확인
      const existingAccount = await mailAccountFileService.getAccountByEmail(email);
      if (existingAccount) {
        return res.status(400).json({
          success: false,
          message: '이미 등록된 이메일입니다.',
        });
      }

      const account = await mailAccountFileService.createAccount({
        name,
        email,
        smtpHost,
        smtpPort,
        smtpSecure: smtpSecure || false,
        smtpUsername,
        smtpPassword,
        dailyLimit: dailyLimit || 1000,
        status: status || 'active',
      });

      // 비밀번호 제외하고 반환
      const { smtpPassword: _, ...safeAccount } = account;

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

  async updateAccount(req: Request, res: Response) {
    try {
      const { id } = req.params;
      const updates = req.body;

      const account = await mailAccountFileService.updateAccount(id, updates);

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

      // 비밀번호 제외하고 반환
      const { smtpPassword: _, ...safeAccount } = account;

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

  async deleteAccount(req: Request, res: Response) {
    try {
      const { id } = req.params;
      const success = await mailAccountFileService.deleteAccount(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,
      });
    }
  }

  async testConnection(req: Request, res: Response) {
    try {
      const { id } = req.params;
      
      const account = await mailAccountFileService.getAccountById(id);
      if (!account) {
        return res.status(404).json({
          success: false,
          message: '계정을 찾을 수 없습니다.',
        });
      }

      // mailSendSimpleService의 testConnection 사용
      const { mailSendSimpleService } = require('../services/mailSendSimpleService');
      const result = await mailSendSimpleService.testConnection(id);

      return res.json(result);
    } catch (error: unknown) {
      const err = error as Error;
      return res.status(500).json({
        success: false,
        message: '연결 테스트 실패',
        error: err.message,
      });
    }
  }
}

export const mailAccountFileController = new MailAccountFileController();

