import {
  Controller,
  Get,
  Post,
  Patch,
  Delete,
  Body,
  Param,
  Query,
  UseGuards,
  Logger,
} from '@nestjs/common';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { AdminGuard } from './guards/admin.guard';
import { CurrentUser } from '../auth/decorators/current-user.decorator';
import { User } from '../../entities/user.entity';
import { AdminService } from './admin.service';
import { SlackService } from '../notifications/slack.service';

@Controller('api/admin')
@UseGuards(JwtAuthGuard, AdminGuard)
export class AdminController {
  private readonly logger = new Logger(AdminController.name);

  constructor(
    private adminService: AdminService,
    private slackService: SlackService,
  ) { }

  @Get('stats')
  async getDashboardStats() {
    this.logger.log('Fetching dashboard statistics');
    return this.adminService.getDashboardStats();
  }

  @Get('users')
  async getAllUsers(
    @Query('page') page?: string,
    @Query('limit') limit?: string,
    @Query('search') search?: string,
  ) {
    const pageNum = page ? parseInt(page) : 1;
    const limitNum = limit ? parseInt(limit) : 20;
    this.logger.log(`Fetching users - page: ${pageNum}, limit: ${limitNum}`);
    return this.adminService.getAllUsers(pageNum, limitNum, search);
  }

  @Get('users/:id')
  async getUserDetails(@Param('id') userId: string) {
    this.logger.log(`Fetching user details for: ${userId}`);
    return this.adminService.getUserDetails(userId);
  }

  @Patch('users/:id/status')
  async updateUserStatus(
    @Param('id') userId: string,
    @Body('isActive') isActive: boolean,
  ) {
    this.logger.log(`Updating user status: ${userId} - isActive: ${isActive}`);
    return this.adminService.updateUserStatus(userId, isActive);
  }

  @Patch('users/:id/role')
  async updateUserRole(
    @Param('id') userId: string,
    @Body('role') role: string,
  ) {
    this.logger.log(`Updating user role: ${userId} - role: ${role}`);
    return this.adminService.updateUserRole(userId, role);
  }

  @Delete('users/:id')
  async deleteUser(@Param('id') userId: string) {
    this.logger.log(`Deleting user: ${userId}`);
    return this.adminService.deleteUser(userId);
  }

  @Get('recent-builds')
  async getRecentBuilds(@Query('limit') limit?: string) {
    const limitNum = limit ? parseInt(limit) : 10;
    return this.adminService.getRecentBuilds(limitNum);
  }

  @Get('recent-users')
  async getRecentUsers(@Query('limit') limit?: string) {
    const limitNum = limit ? parseInt(limit) : 10;
    return this.adminService.getRecentUsers(limitNum);
  }

  @Get('apps-with-icons')
  async getAllAppsWithIcons(@Query('limit') limit?: string) {
    const limitNum = limit ? parseInt(limit) : 50;
    return this.adminService.getAllAppsWithIcons(limitNum);
  }

  @Get('builds')
  async getAllBuilds(
    @Query('page') page?: string,
    @Query('limit') limit?: string,
    @Query('search') search?: string,
  ) {
    const pageNum = page ? parseInt(page) : 1;
    const limitNum = limit ? parseInt(limit) : 20;
    return this.adminService.getAllBuilds(pageNum, limitNum, search);
  }

  @Get('active-users')
  async getActiveUsers(
    @Query('page') page?: string,
    @Query('limit') limit?: string,
  ) {
    const pageNum = page ? parseInt(page) : 1;
    const limitNum = limit ? parseInt(limit) : 20;
    return this.adminService.getActiveUsers(pageNum, limitNum);
  }

  @Get('unique-apps')
  async getUniqueApps(
    @Query('page') page?: string,
    @Query('limit') limit?: string,
    @Query('search') search?: string,
  ) {
    const pageNum = page ? parseInt(page) : 1;
    const limitNum = limit ? parseInt(limit) : 20;
    return this.adminService.getUniqueApps(pageNum, limitNum, search);
  }

  @Patch('users/:id/settings')
  async updateUserSettings(
    @Param('id') userId: string,
    @Body() body: { buildLinkExpiryDays?: number | null; aiReleaseNotesEnabled?: boolean | null; maxBuildSizeMb?: number | null; cicdEnabled?: boolean | null; slackEnabled?: boolean | null },
  ) {
    this.logger.log(`Updating user settings: ${userId} - ${JSON.stringify(body)}`);
    return this.adminService.updateUserSettings(userId, body);
  }

  @Get('settings')
  async getSettings() {
    return this.adminService.getSettings();
  }

  @Patch('settings')
  async updateSettings(
    @Body() body: { buildLinkExpiryDays?: number; aiReleaseNotesEnabled?: boolean; maxBuildSizeMb?: number; cicdEnabled?: boolean; slackEnabled?: boolean },
  ) {
    this.logger.log(`Updating platform settings: ${JSON.stringify(body)}`);
    return this.adminService.updateSettings(body);
  }

  @Post('test-slack')
  async testSlack(@CurrentUser() user: User) {
    this.logger.log('Testing Slack integration');
    const result = await this.slackService.sendTestNotification(user);
    return { 
      success: result,
      message: result 
        ? 'Test notification sent successfully! Check your Slack channel.' 
        : 'Slack webhook not configured. Please connect your Slack workspace or set SLACK_WEBHOOK_URL in .env file.'
    };
  }
}
