// 수집 관리 컨트롤러
// 작성일: 2024-12-23

import { Request, Response } from 'express';
import { CollectionService } from '../services/collectionService';
import { DataCollectionConfig, CollectionFilter } from '../types/collectionManagement';
import { AuthenticatedRequest } from '../middleware/authMiddleware';

export class CollectionController {
  /**
   * 수집 설정 목록 조회
   */
  static async getCollectionConfigs(req: AuthenticatedRequest, res: Response): Promise<void> {
    try {
      const filter: CollectionFilter = {
        config_name: req.query.config_name as string,
        source_connection_id: req.query.source_connection_id ? parseInt(req.query.source_connection_id as string) : undefined,
        collection_type: req.query.collection_type as string,
        is_active: req.query.is_active as string,
        company_code: req.user?.companyCode || '*',
        search: req.query.search as string,
      };

      const configs = await CollectionService.getCollectionConfigs(filter);

      res.status(200).json({
        success: true,
        data: configs,
        message: '수집 설정 목록을 조회했습니다.',
      });
    } catch (error) {
      console.error('수집 설정 목록 조회 오류:', error);
      res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '수집 설정 목록 조회에 실패했습니다.',
      });
    }
  }

  /**
   * 수집 설정 상세 조회
   */
  static async getCollectionConfigById(req: AuthenticatedRequest, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      if (isNaN(id)) {
        res.status(400).json({
          success: false,
          message: '유효하지 않은 ID입니다.',
        });
        return;
      }

      const config = await CollectionService.getCollectionConfigById(id);
      if (!config) {
        res.status(404).json({
          success: false,
          message: '수집 설정을 찾을 수 없습니다.',
        });
        return;
      }

      res.status(200).json({
        success: true,
        data: config,
        message: '수집 설정을 조회했습니다.',
      });
    } catch (error) {
      console.error('수집 설정 조회 오류:', error);
      res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '수집 설정 조회에 실패했습니다.',
      });
    }
  }

  /**
   * 수집 설정 생성
   */
  static async createCollectionConfig(req: AuthenticatedRequest, res: Response): Promise<void> {
    try {
      const data: DataCollectionConfig = {
        ...req.body,
        company_code: req.user?.companyCode || '*',
        created_by: req.user?.userId,
      };

      // 필수 필드 검증
      if (!data.config_name || !data.source_connection_id || !data.source_table || !data.collection_type) {
        res.status(400).json({
          success: false,
          message: '필수 필드가 누락되었습니다.',
        });
        return;
      }

      const config = await CollectionService.createCollectionConfig(data);

      res.status(201).json({
        success: true,
        data: config,
        message: '수집 설정을 생성했습니다.',
      });
    } catch (error) {
      console.error('수집 설정 생성 오류:', error);
      res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '수집 설정 생성에 실패했습니다.',
      });
    }
  }

  /**
   * 수집 설정 수정
   */
  static async updateCollectionConfig(req: AuthenticatedRequest, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      if (isNaN(id)) {
        res.status(400).json({
          success: false,
          message: '유효하지 않은 ID입니다.',
        });
        return;
      }

      const data: Partial<DataCollectionConfig> = {
        ...req.body,
        updated_by: req.user?.userId,
      };

      const config = await CollectionService.updateCollectionConfig(id, data);

      res.status(200).json({
        success: true,
        data: config,
        message: '수집 설정을 수정했습니다.',
      });
    } catch (error) {
      console.error('수집 설정 수정 오류:', error);
      res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '수집 설정 수정에 실패했습니다.',
      });
    }
  }

  /**
   * 수집 설정 삭제
   */
  static async deleteCollectionConfig(req: AuthenticatedRequest, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      if (isNaN(id)) {
        res.status(400).json({
          success: false,
          message: '유효하지 않은 ID입니다.',
        });
        return;
      }

      await CollectionService.deleteCollectionConfig(id);

      res.status(200).json({
        success: true,
        message: '수집 설정을 삭제했습니다.',
      });
    } catch (error) {
      console.error('수집 설정 삭제 오류:', error);
      res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '수집 설정 삭제에 실패했습니다.',
      });
    }
  }

  /**
   * 수집 작업 실행
   */
  static async executeCollection(req: AuthenticatedRequest, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      if (isNaN(id)) {
        res.status(400).json({
          success: false,
          message: '유효하지 않은 ID입니다.',
        });
        return;
      }

      const job = await CollectionService.executeCollection(id);

      res.status(200).json({
        success: true,
        data: job,
        message: '수집 작업을 시작했습니다.',
      });
    } catch (error) {
      console.error('수집 작업 실행 오류:', error);
      res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '수집 작업 실행에 실패했습니다.',
      });
    }
  }

  /**
   * 수집 작업 목록 조회
   */
  static async getCollectionJobs(req: AuthenticatedRequest, res: Response): Promise<void> {
    try {
      const configId = req.query.config_id ? parseInt(req.query.config_id as string) : undefined;
      const jobs = await CollectionService.getCollectionJobs(configId);

      res.status(200).json({
        success: true,
        data: jobs,
        message: '수집 작업 목록을 조회했습니다.',
      });
    } catch (error) {
      console.error('수집 작업 목록 조회 오류:', error);
      res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '수집 작업 목록 조회에 실패했습니다.',
      });
    }
  }

  /**
   * 수집 이력 조회
   */
  static async getCollectionHistory(req: AuthenticatedRequest, res: Response): Promise<void> {
    try {
      const configId = parseInt(req.params.configId);
      if (isNaN(configId)) {
        res.status(400).json({
          success: false,
          message: '유효하지 않은 설정 ID입니다.',
        });
        return;
      }

      const history = await CollectionService.getCollectionHistory(configId);

      res.status(200).json({
        success: true,
        data: history,
        message: '수집 이력을 조회했습니다.',
      });
    } catch (error) {
      console.error('수집 이력 조회 오류:', error);
      res.status(500).json({
        success: false,
        message: error instanceof Error ? error.message : '수집 이력 조회에 실패했습니다.',
      });
    }
  }
}
