import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Param,
  Body,
  UseGuards,
  ParseIntPipe,
  Query,
} from '@nestjs/common';
import { IsObject } from 'class-validator';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { Permissions } from '../auth/permissions.decorator';
import { PermissionsGuard } from '../auth/guards/permissions.guard';
import { CasesService } from './cases.service';
import { CreateCaseDto } from './dto/create-case.dto';
import { UpdateCaseDto } from './dto/update-case.dto';

export class CaseEntryDto {
  @IsObject()
  payload!: Record<string, any>;
}

@Controller('api/v1/admin/cases')
@UseGuards(JwtAuthGuard, PermissionsGuard)
export class CasesController {
  constructor(private readonly casesService: CasesService) {}

  @Post()
  @Permissions('case.create')
  async create(@Body() dto: CreateCaseDto) {
    const data = await this.casesService.create(dto);
    return { success: true, message: 'Case created', data };
  }

  @Get()
  @Permissions('case.view')
  async findAll(@Query('search') search?: string) {
    const data = await this.casesService.findAll(search);
    return { success: true, message: 'Success', data };
  }

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

  @Put(':id')
  @Permissions('case.update')
  async update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateCaseDto) {
    const data = await this.casesService.update(id, dto);
    if (!data) return { success: false, message: 'Case not found' };
    return { success: true, message: 'Case updated', data };
  }

  @Post(':id/entries')
  @Permissions('case.update')
  async addEntry(@Param('id', ParseIntPipe) id: number, @Body() dto: CaseEntryDto) {
    const data = await this.casesService.addEntry(id, dto.payload);
    return { success: true, message: 'Case entry added', data };
  }

  @Delete('entries/:entryId')
  @Permissions('case.update')
  async deleteEntry(@Param('entryId', ParseIntPipe) entryId: number) {
    const success = await this.casesService.deleteEntry(entryId);
    return { success, message: success ? 'Case entry deleted' : 'Case entry not found' };
  }

  @Post(':id/publish')
  @Permissions('case.publish')
  async publish(@Param('id', ParseIntPipe) id: number) {
    const data = await this.casesService.setStatus(id, 'PUBLISHED');
    return { success: true, message: 'Case published', data };
  }

  @Post(':id/archive')
  @Permissions('case.publish')
  async archive(@Param('id', ParseIntPipe) id: number) {
    const data = await this.casesService.setStatus(id, 'ARCHIVED');
    return { success: true, message: 'Case archived', data };
  }

  @Delete(':id')
  @Permissions('case.delete')
  async delete(@Param('id', ParseIntPipe) id: number) {
    const success = await this.casesService.delete(id);
    return { success, message: success ? 'Case deleted' : 'Case not found' };
  }
}
