import { Request, Response } from "express";
import { DbTypeCategoryService } from "../services/dbTypeCategoryService";
import { AuthenticatedRequest } from "../types/auth";

export class DbTypeCategoryController {
  /**
   * GET /api/db-type-categories
   * 모든 DB 타입 카테고리 조회
   */
  static async getAllCategories(req: AuthenticatedRequest, res: Response) {
    try {
      const result = await DbTypeCategoryService.getAllCategories();
      
      if (result.success) {
        return res.json(result);
      } else {
        return res.status(400).json(result);
      }
    } catch (error) {
      console.error("DB 타입 카테고리 조회 오류:", error);
      return res.status(500).json({
        success: false,
        message: "DB 타입 카테고리 조회 중 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류"
      });
    }
  }

  /**
   * GET /api/db-type-categories/:typeCode
   * 특정 DB 타입 카테고리 조회
   */
  static async getCategoryByTypeCode(req: AuthenticatedRequest, res: Response) {
    try {
      const { typeCode } = req.params;
      
      if (!typeCode) {
        return res.status(400).json({
          success: false,
          message: "DB 타입 코드가 필요합니다."
        });
      }

      const result = await DbTypeCategoryService.getCategoryByTypeCode(typeCode);
      
      if (result.success) {
        return res.json(result);
      } else {
        return res.status(404).json(result);
      }
    } catch (error) {
      console.error("DB 타입 카테고리 조회 오류:", error);
      return res.status(500).json({
        success: false,
        message: "DB 타입 카테고리 조회 중 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류"
      });
    }
  }

  /**
   * POST /api/db-type-categories
   * DB 타입 카테고리 생성
   */
  static async createCategory(req: AuthenticatedRequest, res: Response) {
    try {
      const { type_code, display_name, icon, color, sort_order } = req.body;
      
      if (!type_code || !display_name) {
        return res.status(400).json({
          success: false,
          message: "DB 타입 코드와 표시명은 필수입니다."
        });
      }

      const result = await DbTypeCategoryService.createCategory({
        type_code,
        display_name,
        icon,
        color,
        sort_order
      });
      
      if (result.success) {
        return res.status(201).json(result);
      } else {
        return res.status(400).json(result);
      }
    } catch (error) {
      console.error("DB 타입 카테고리 생성 오류:", error);
      return res.status(500).json({
        success: false,
        message: "DB 타입 카테고리 생성 중 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류"
      });
    }
  }

  /**
   * PUT /api/db-type-categories/:typeCode
   * DB 타입 카테고리 수정
   */
  static async updateCategory(req: AuthenticatedRequest, res: Response) {
    try {
      const { typeCode } = req.params;
      const { display_name, icon, color, sort_order, is_active } = req.body;
      
      if (!typeCode) {
        return res.status(400).json({
          success: false,
          message: "DB 타입 코드가 필요합니다."
        });
      }

      const result = await DbTypeCategoryService.updateCategory(typeCode, {
        display_name,
        icon,
        color,
        sort_order,
        is_active
      });
      
      if (result.success) {
        return res.json(result);
      } else {
        return res.status(400).json(result);
      }
    } catch (error) {
      console.error("DB 타입 카테고리 수정 오류:", error);
      return res.status(500).json({
        success: false,
        message: "DB 타입 카테고리 수정 중 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류"
      });
    }
  }

  /**
   * DELETE /api/db-type-categories/:typeCode
   * DB 타입 카테고리 삭제 (비활성화)
   */
  static async deleteCategory(req: AuthenticatedRequest, res: Response) {
    try {
      const { typeCode } = req.params;
      
      if (!typeCode) {
        return res.status(400).json({
          success: false,
          message: "DB 타입 코드가 필요합니다."
        });
      }

      const result = await DbTypeCategoryService.deleteCategory(typeCode);
      
      if (result.success) {
        return res.json(result);
      } else {
        return res.status(400).json(result);
      }
    } catch (error) {
      console.error("DB 타입 카테고리 삭제 오류:", error);
      return res.status(500).json({
        success: false,
        message: "DB 타입 카테고리 삭제 중 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류"
      });
    }
  }

  /**
   * GET /api/db-type-categories/stats/connections
   * DB 타입별 연결 통계 조회
   */
  static async getConnectionStatsByType(req: AuthenticatedRequest, res: Response) {
    try {
      const result = await DbTypeCategoryService.getConnectionStatsByType();
      
      if (result.success) {
        return res.json(result);
      } else {
        return res.status(400).json(result);
      }
    } catch (error) {
      console.error("DB 타입별 통계 조회 오류:", error);
      return res.status(500).json({
        success: false,
        message: "DB 타입별 통계 조회 중 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류"
      });
    }
  }

  /**
   * POST /api/db-type-categories/initialize
   * 기본 DB 타입 카테고리 초기화
   */
  static async initializeDefaultCategories(req: AuthenticatedRequest, res: Response) {
    try {
      const result = await DbTypeCategoryService.initializeDefaultCategories();
      
      if (result.success) {
        return res.json(result);
      } else {
        return res.status(400).json(result);
      }
    } catch (error) {
      console.error("기본 카테고리 초기화 오류:", error);
      return res.status(500).json({
        success: false,
        message: "기본 카테고리 초기화 중 오류가 발생했습니다.",
        error: error instanceof Error ? error.message : "알 수 없는 오류"
      });
    }
  }
}
