import {
  BadRequestException,
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseIntPipe,
  Post,
  Put,
  Query,
} from '@nestjs/common';
import { DrawingsService } from './drawings.service';
import { SaveDrawingDto, UpdateDrawingDto } from './dto/drawing.dto';

/**
 * Learner-facing and therefore unauthenticated: the mobile app has no login.
 * Ownership is enforced through the anonymous session id.
 */
@Controller('api/v1/drawings')
export class DrawingsController {
  constructor(private readonly service: DrawingsService) {}

  @Post()
  async save(@Body() dto: SaveDrawingDto) {
    const data = await this.service.save(dto);
    return { success: true, message: 'Drawing saved', data };
  }

  @Get()
  async findBySession(
    @Query('sessionId') sessionId: string,
    @Query('activityId') activityId?: string,
  ) {
    if (!sessionId) throw new BadRequestException('sessionId is required');

    if (activityId) {
      const data = await this.service.findForActivity(sessionId, Number(activityId));
      return { success: true, message: 'Success', data };
    }

    const data = await this.service.findBySession(sessionId);
    return { success: true, message: 'Success', data };
  }

  @Get(':id')
  async findById(@Param('id', ParseIntPipe) id: number, @Query('sessionId') sessionId: string) {
    const drawing = await this.service.findById(id);
    if (!drawing) return { success: false, message: 'Drawing not found' };
    if (sessionId && drawing.anonymousSessionId !== sessionId) {
      return { success: false, message: 'Drawing not found' };
    }
    return { success: true, message: 'Success', data: drawing };
  }

  @Put(':id')
  async update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateDrawingDto) {
    const data = await this.service.update(id, dto);
    return { success: true, message: 'Drawing updated', data };
  }

  @Delete(':id')
  async delete(@Param('id', ParseIntPipe) id: number, @Query('sessionId') sessionId: string) {
    if (!sessionId) throw new BadRequestException('sessionId is required');
    const success = await this.service.delete(id, sessionId);
    return { success, message: success ? 'Drawing deleted' : 'Drawing not found' };
  }
}
