import { Body, Controller, Get, Param, Patch, Post, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { GetUser } from 'src/auth/get-user.decorator';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { EjerciciosService } from '../services/ejercicios.service';

@ApiTags('Contabilidad - Ejercicios')
@Controller({ path: 'contabilidad/ejercicios', version: '1' })
@UseGuards(AuthGuard('jwt'), PermissionGuard)
@ApiBearerAuth()
export class EjerciciosController {
  constructor(private readonly service: EjerciciosService) {}

  @Get()
  @RequirePermission('CONTABILIDAD', 'CONT_EJE_EJERCICIO_VER')
  @ApiOperation({ summary: 'Listar ejercicios contables con sus períodos' })
  listar(@GetUser() user: LoginUserInfo) {
    return this.service.listar(user.empresa_id);
  }

  @Post()
  @RequirePermission('CONTABILIDAD', 'CONT_EJE_EJERCICIO_CREAR')
  @ApiOperation({ summary: 'Crear ejercicio contable (genera 12 períodos si generarPeriodosAuto=true)' })
  crear(
    @GetUser() user: LoginUserInfo,
    @Body() body: { anio: number; generarPeriodosAuto?: boolean },
  ) {
    return this.service.crear(user.empresa_id, { anio: body.anio, generarPeriodosAuto: body.generarPeriodosAuto ?? true }, user.id);
  }

  @Patch(':id/cerrar')
  @RequirePermission('CONTABILIDAD', 'CONT_EJE_EJERCICIO_CERRAR')
  @ApiOperation({ summary: 'Cerrar ejercicio (requiere todos los períodos cerrados)' })
  cerrar(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.cerrar(id, user.empresa_id, user.id);
  }

  @Post(':id/periodos')
  @RequirePermission('CONTABILIDAD', 'CONT_EJE_EJERCICIO_EDITAR')
  @ApiOperation({ summary: 'Agregar período manualmente a un ejercicio' })
  crearPeriodo(
    @Param('id') ejercicioId: string,
    @GetUser() user: LoginUserInfo,
    @Body() body: { numero: number; mes: number; fecha_inicio: string; fecha_fin: string },
  ) {
    return this.service.crearPeriodoManual(ejercicioId, user.empresa_id, body);
  }
}
