import {
  Controller,
  Get,
  Patch,
  Post,
  Body,
  Param,
  UseGuards,
  Request,
  HttpStatus,
  HttpException,
} from '@nestjs/common';
import { AppConfigService } from './config.service';
import { UpdateConfigDto } from './dto/update-config.dto';
import { TestSmtpDto } from './dto/test-smtp.dto';

@Controller('configuration')
export class ConfigController {
  constructor(private readonly configService: AppConfigService) {}

  /**
   * Vérifier si la configuration initiale est terminée
   * GET /api/v1/configuration/setup/status
   */
  @Get('setup/status')
  async getSetupStatus() {
    try {
      const isCompleted = this.configService.isSetupCompleted();
      return {
        success: true,
        data: {
          setupCompleted: isCompleted,
        },
      };
    } catch (error) {
      throw new HttpException(
        {
          success: false,
          message: 'Erreur lors de la vérification du statut de configuration',
          error: error.message,
        },
        HttpStatus.INTERNAL_SERVER_ERROR,
      );
    }
  }

  /**
   * Marquer la configuration initiale comme terminée
   * POST /api/v1/configuration/setup/complete
   */
  @Post('setup/complete')
  // @UseGuards(JwtAuthGuard, RolesGuard)
  // @Roles('super_admin')
  async completeSetup(@Request() req: any) {
    try {
      const userId = req.user?.id ?? null;

      await this.configService.markSetupCompleted(userId);

      return {
        success: true,
        message: 'Configuration initiale terminée avec succès',
      };
    } catch (error) {
      throw new HttpException(
        {
          success: false,
          message: 'Erreur lors de la finalisation de la configuration',
          error: error.message,
        },
        HttpStatus.INTERNAL_SERVER_ERROR,
      );
    }
  }

  /**
   * Test de la connexion SMTP
   * POST /api/v1/configuration/test-smtp
   */
  @Post('test-smtp')
  // @UseGuards(JwtAuthGuard, RolesGuard)
  // @Roles('super_admin')
  async testSmtp(@Body() testSmtpDto: TestSmtpDto) {
    try {
      const result = await this.configService.testSmtpConnection(testSmtpDto.testEmail);

      if (result.success) {
        return {
          success: true,
          message: 'Connexion SMTP réussie. Email de test envoyé.',
        };
      } else {
        return {
          success: false,
          message: 'Échec du test SMTP',
          error: result.error,
        };
      }
    } catch (error) {
      throw new HttpException(
        {
          success: false,
          message: 'Erreur lors du test SMTP',
          error: error.message,
        },
        HttpStatus.INTERNAL_SERVER_ERROR,
      );
    }
  }

  /**
   * Mise à jour multiple des configurations
   * PATCH /api/v1/configuration/bulk
   */
  @Patch('bulk')
  // @UseGuards(JwtAuthGuard, RolesGuard)
  // @Roles('super_admin')
  async updateBulk(@Body() updateConfigDto: UpdateConfigDto, @Request() req: any) {
    try {
      // TODO: Récupérer l'ID utilisateur depuis le JWT
      const userId = req.user?.id || null;

      let updated = 0;
      const errors: string[] = [];

      // Parcourir toutes les clés du DTO
      for (const [key, value] of Object.entries(updateConfigDto)) {
        if (value !== undefined) {
          try {
            await this.configService.set(key, value, userId);
            updated++;
          } catch (error) {
            errors.push(`${key}: ${error.message}`);
          }
        }
      }

      // Recharger le cache après les modifications
      await this.configService.loadCache();

      if (errors.length > 0) {
        return {
          success: false,
          message: 'Certaines configurations n\'ont pas pu être mises à jour',
          updated,
          errors,
        };
      }

      return {
        success: true,
        message: 'Configuration mise à jour avec succès',
        updated,
      };
    } catch (error) {
      throw new HttpException(
        {
          success: false,
          message: 'Erreur lors de la mise à jour des configurations',
          error: error.message,
        },
        HttpStatus.INTERNAL_SERVER_ERROR,
      );
    }
  }

  /**
   * Récupérer toutes les configurations (pour l'admin)
   * GET /api/v1/configuration
   */
  @Get()
  // @UseGuards(JwtAuthGuard, RolesGuard)
  // @Roles('super_admin')
  async getAll() {
    try {
      const configs = await this.configService.getAll();
      return {
        success: true,
        data: configs,
      };
    } catch (error) {
      throw new HttpException(
        {
          success: false,
          message: 'Erreur lors de la récupération des configurations',
          error: error.message,
        },
        HttpStatus.INTERNAL_SERVER_ERROR,
      );
    }
  }

  /**
   * Récupérer les configurations par catégorie
   * GET /api/v1/configuration/:category
   */
  @Get(':category')
  // @UseGuards(JwtAuthGuard, RolesGuard)
  // @Roles('super_admin')
  async getByCategory(@Param('category') category: string) {
    try {
      if (!['email', 'app', 'security'].includes(category)) {
        throw new HttpException(
          {
            success: false,
            message: 'Catégorie invalide. Valeurs acceptées: email, app, security',
          },
          HttpStatus.BAD_REQUEST,
        );
      }

      const configs = await this.configService.getByCategory(category);
      return {
        success: true,
        data: configs,
      };
    } catch (error) {
      if (error instanceof HttpException) {
        throw error;
      }
      throw new HttpException(
        {
          success: false,
          message: 'Erreur lors de la récupération des configurations',
          error: error.message,
        },
        HttpStatus.INTERNAL_SERVER_ERROR,
      );
    }
  }
}
