import {
  Body,
  Controller,
  Get,
  Param,
  ParseIntPipe,
  Post,
  UseGuards,
} from '@nestjs/common';
import { IsOptional, IsString, MaxLength } from 'class-validator';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { PermissionsGuard } from '../auth/guards/permissions.guard';
import { Permissions } from '../auth/permissions.decorator';
import { AuditAction } from '../common/decorators/audit.decorator';
import { CurrentUser, AuthenticatedUser } from '../common/decorators/current-user.decorator';
import { ModuleVersionsService } from './module-versions.service';

export class ChangeReasonDto {
  @IsOptional()
  @IsString()
  @MaxLength(1000)
  changeReason?: string;
}

@Controller('api/v1/admin/modules/:moduleId/versions')
@UseGuards(JwtAuthGuard, PermissionsGuard)
export class ModuleVersionsController {
  constructor(private readonly service: ModuleVersionsService) {}

  @Get()
  @Permissions('module.view')
  async findAll(@Param('moduleId', ParseIntPipe) moduleId: number) {
    const data = await this.service.findByModule(moduleId);
    return { success: true, message: 'Success', data };
  }

  /** The exact payload the mobile app would render - powers admin Preview. */
  @Get('preview')
  @Permissions('module.view')
  async preview(@Param('moduleId', ParseIntPipe) moduleId: number) {
    const data = await this.service.snapshot(moduleId);
    return { success: true, message: 'Success', data };
  }

  @Get(':versionId')
  @Permissions('module.view')
  async findById(@Param('versionId', ParseIntPipe) versionId: number) {
    const data = await this.service.findById(versionId);
    if (!data) return { success: false, message: 'Version not found' };
    return { success: true, message: 'Success', data };
  }

  @Post()
  @Permissions('module.update')
  @AuditAction('MODULE_VERSION_CREATED')
  async create(
    @Param('moduleId', ParseIntPipe) moduleId: number,
    @Body() dto: ChangeReasonDto,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    const data = await this.service.createVersion(moduleId, {
      changeReason: dto.changeReason,
      userId: user.id,
    });
    return { success: true, message: 'Version created', data };
  }
}
