import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Param,
  Body,
  UseGuards,
  Request,
  UseInterceptors,
  UploadedFiles,
  HttpCode,
  HttpStatus,
} from '@nestjs/common';
import { FileFieldsInterceptor } from '@nestjs/platform-express';
import { AuthGuard } from '../auth/auth.guard';
import { FeatureFlagGuard } from '@/modules/feature-flags/feature-flag.guard';
import { RequireFeature } from '@/modules/feature-flags/require-feature.decorator';
import { ProfilesService } from './profiles.service';
import { CreateProfileDto, UpdateProfileDto } from './pets.dto';
import { imageUploadOptions } from '@/utils/image/image-upload.options';

@Controller('pet/profiles')
@UseGuards(FeatureFlagGuard)
@RequireFeature('section_reports_enabled')
export class ProfilesController {
  constructor(private readonly profilesService: ProfilesService) {}

  @Get()
  @UseGuards(AuthGuard)
  @HttpCode(HttpStatus.OK)
  getProfiles(@Request() req) {
    return this.profilesService.getProfiles(req.user.id);
  }

  // Express's profile.routes.ts comment claims this is public, but it's mounted
  // under `/pet` in routes/index.ts with `requireAuth` applied to the whole
  // sub-router — the comment is stale, the real behavior requires auth.
  @Get('all')
  @UseGuards(AuthGuard)
  @HttpCode(HttpStatus.OK)
  getAllProfiles() {
    return this.profilesService.getAllProfiles();
  }

  // Same as `/all` — Express's comment says public, but `requireAuth` actually
  // gates the whole `/pet` sub-router this route lives under.
  @Get('suburb/:suburb')
  @UseGuards(AuthGuard)
  @HttpCode(HttpStatus.OK)
  getProfilesBySuburb(@Param('suburb') suburb: string) {
    return this.profilesService.getProfilesBySuburb(suburb);
  }

  @Post()
  @UseGuards(AuthGuard)
  @UseInterceptors(
    FileFieldsInterceptor(
      [
        { name: 'photos', maxCount: 10 },
        { name: 'biometricPhotos', maxCount: 10 },
      ],
      imageUploadOptions(5),
    ),
  )
  @HttpCode(HttpStatus.CREATED)
  createProfile(
    @Request() req,
    @Body() body: CreateProfileDto,
    @UploadedFiles()
    files?: {
      photos?: Express.Multer.File[];
      biometricPhotos?: Express.Multer.File[];
    },
  ) {
    return this.profilesService.createProfile(req.user.id, body, files);
  }

  @Get(':id')
  @UseGuards(AuthGuard)
  @HttpCode(HttpStatus.OK)
  getProfile(@Request() req, @Param('id') id: string) {
    return this.profilesService.getProfile(id, req.user.id);
  }

  @Get('shared/:id')
  @UseGuards(AuthGuard)
  @HttpCode(HttpStatus.OK)
  getSharedProfile(@Request() req, @Param('id') id: string) {
    return this.profilesService.getSharedProfile(id, req.user.id);
  }

  @Put(':id')
  @UseGuards(AuthGuard)
  @UseInterceptors(
    FileFieldsInterceptor(
      [
        { name: 'photos', maxCount: 10 },
        { name: 'biometricPhotos', maxCount: 10 },
      ],
      imageUploadOptions(5),
    ),
  )
  @HttpCode(HttpStatus.OK)
  updateProfile(
    @Request() req,
    @Param('id') id: string,
    @Body() body: UpdateProfileDto,
    @UploadedFiles()
    files?: {
      photos?: Express.Multer.File[];
      biometricPhotos?: Express.Multer.File[];
    },
  ) {
    return this.profilesService.updateProfile(id, req.user.id, body, files);
  }

  @Delete(':id')
  @UseGuards(AuthGuard)
  @HttpCode(HttpStatus.OK)
  deleteProfile(@Request() req, @Param('id') id: string) {
    return this.profilesService.deleteProfile(id, req.user.id);
  }
}
