import { Body, Controller, Get, Param, Patch, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, 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 { PeriodosService } from '../services/periodos.service';

@ApiTags('Contabilidad - Períodos')
@Controller({ path: 'contabilidad/periodos', version: '1' })
@UseGuards(AuthGuard('jwt'), PermissionGuard)
@ApiBearerAuth()
export class PeriodosController {
  constructor(private readonly service: PeriodosService) {}

  @Get()
  @RequirePermission('CONTABILIDAD', 'CONT_PER_PERIODO_VER')
  @ApiOperation({ summary: 'Listar períodos contables' })
  @ApiQuery({ name: 'ejercicioId', required: false })
  listar(@GetUser() user: LoginUserInfo, @Query('ejercicioId') ejercicioId?: string) {
    return this.service.listar(user.empresa_id, ejercicioId);
  }

  @Get('activo')
  @RequirePermission('CONTABILIDAD', 'CONT_PER_PERIODO_VER')
  @ApiOperation({ summary: 'Retorna el período activo para hoy (null si no hay)' })
  async getPeriodoActivo(@GetUser() user: LoginUserInfo) {
    const periodoId = await this.service.getPeriodoActivo(user.empresa_id);
    return { periodoId };
  }

  @Patch(':id/cerrar')
  @RequirePermission('CONTABILIDAD', 'CONT_PER_PERIODO_CERRAR')
  @ApiOperation({ summary: 'Cerrar período (con período de ajuste opcional)' })
  cerrar(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() body?: { dias_ajuste?: number },
  ) {
    return this.service.cerrar(id, user.empresa_id, body?.dias_ajuste, user.id);
  }

  @Patch(':id/reabrir')
  @RequirePermission('CONTABILIDAD', 'CONT_PER_PERIODO_REABRIR')
  @ApiOperation({ summary: 'Reabrir período cerrado (solo admin)' })
  reabrir(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.reabrir(id, user.empresa_id, user.id);
  }

  @Patch(':id/bloquear')
  @RequirePermission('CONTABILIDAD', 'CONT_PER_PERIODO_BLOQUEAR')
  @ApiOperation({ summary: 'Bloquear período definitivamente' })
  bloquear(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.bloquear(id, user.empresa_id, user.id);
  }
}
