import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  UploadedFile,
  UseGuards,
  UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { GetUser } from 'src/auth/get-user.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { RequireModule, RequirePermission } from 'src/auth/decorators';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { EcommerceNovedadesService, UpsertNovedadDto } from './ecommerce-novedades.service';

@ApiTags('ecommerce-novedades')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('ECOMMERCE')
@Controller({ path: 'ecommerce/novedades', version: '1' })
export class EcommerceNovedadesController {
  constructor(private readonly service: EcommerceNovedadesService) {}

  @Get()
  @RequirePermission('ECOMMERCE', 'EC_NOV_NOVEDAD_VER')
  @ApiOperation({ summary: 'Listar novedades del panel' })
  list(@GetUser() user: LoginUserInfo) {
    return this.service.list(user.empresa_id);
  }

  @Post()
  @RequirePermission('ECOMMERCE', 'EC_NOV_NOVEDAD_EDITAR')
  @ApiOperation({ summary: 'Crear novedad' })
  create(@Body() dto: UpsertNovedadDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(user.empresa_id, dto);
  }

  @Patch(':id')
  @RequirePermission('ECOMMERCE', 'EC_NOV_NOVEDAD_EDITAR')
  @ApiOperation({ summary: 'Actualizar novedad' })
  update(@Param('id') id: string, @Body() dto: UpsertNovedadDto, @GetUser() user: LoginUserInfo) {
    return this.service.update(user.empresa_id, id, dto);
  }

  @Delete(':id')
  @RequirePermission('ECOMMERCE', 'EC_NOV_NOVEDAD_EDITAR')
  @ApiOperation({ summary: 'Eliminar novedad' })
  remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.remove(user.empresa_id, id);
  }

  @Post(':id/imagen')
  @RequirePermission('ECOMMERCE', 'EC_NOV_NOVEDAD_EDITAR')
  @ApiOperation({ summary: 'Subir imagen de novedad (WebP, S3)' })
  @UseInterceptors(FileInterceptor('file', { limits: { fileSize: 8 * 1024 * 1024 } }))
  uploadImage(
    @Param('id') id: string,
    @UploadedFile() file: Express.Multer.File,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.uploadImage(user.empresa_id, id, file);
  }

  @Delete(':id/imagen')
  @RequirePermission('ECOMMERCE', 'EC_NOV_NOVEDAD_EDITAR')
  @ApiOperation({ summary: 'Eliminar imagen de novedad' })
  deleteImage(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.deleteImage(user.empresa_id, id);
  }
}
