import { Response } from 'express';
import { AuthenticatedRequest } from '../middlewares/auth';
import { createError, asyncHandler } from '../middlewares/errorHandler';
import { systemConfigService, SystemConfigData } from '../services/systemConfigService';
import logger from '../utils/logger';

/**
 * @route   GET /api/system-config
 * @desc    Get system configuration (admin only)
 * @access  Private (Admin)
 */
export const getSystemConfig = asyncHandler(async (req: AuthenticatedRequest, res: Response) => {
  const user = req.user;
  
  if (!user) {
    throw createError('User not authenticated', 401);
  }

  if (user.role !== 'ADMIN') {
    throw createError('Only administrators can view system configuration', 403);
  }

  logger.info('📊 Getting system configuration', {
    adminId: user.id,
    adminEmail: user.email
  });

  const config = await systemConfigService.getConfig();

  logger.info('✅ System configuration retrieved', {
    adminId: user.id,
    quotaManagementEnabled: config.quotaManagementEnabled
  });

  res.json({
    success: true,
    data: config
  });
});

/**
 * @route   PUT /api/system-config
 * @desc    Update system configuration (admin only)
 * @access  Private (Admin)
 */
export const updateSystemConfig = asyncHandler(async (req: AuthenticatedRequest, res: Response) => {
  const user = req.user;
  
  if (!user) {
    throw createError('User not authenticated', 401);
  }

  if (user.role !== 'ADMIN') {
    throw createError('Only administrators can update system configuration', 403);
  }

  const { quotaManagementEnabled } = req.body;

  // Validate input
  if (quotaManagementEnabled !== undefined && typeof quotaManagementEnabled !== 'boolean') {
    throw createError('quotaManagementEnabled must be a boolean', 400);
  }

  logger.info('📝 Updating system configuration', {
    adminId: user.id,
    adminEmail: user.email,
    updates: { quotaManagementEnabled }
  });

  const updates: Partial<SystemConfigData> = {};
  if (quotaManagementEnabled !== undefined) {
    updates.quotaManagementEnabled = quotaManagementEnabled;
  }

  await systemConfigService.updateConfig(updates);

  logger.info('✅ System configuration updated successfully', {
    adminId: user.id,
    updates
  });

  res.json({
    success: true,
    message: 'System configuration updated successfully',
    data: updates
  });
});

/**
 * @route   GET /api/system-config/quota-enabled
 * @desc    Check if quota management is enabled (for internal use)
 * @access  Private (All authenticated users)
 */
export const checkQuotaManagementEnabled = asyncHandler(async (req: AuthenticatedRequest, res: Response) => {
  const user = req.user;
  
  if (!user) {
    throw createError('User not authenticated', 401);
  }

  const isEnabled = await systemConfigService.isQuotaManagementEnabled();

  res.json({
    success: true,
    data: {
      quotaManagementEnabled: isEnabled
    }
  });
});
