import { Body, Controller, Delete, Get, Param, Patch, Post, 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 { PlanCuentasService } from '../services/plan-cuentas.service';

@ApiTags('Contabilidad - Plan de Cuentas')
@Controller({ path: 'contabilidad/plan-cuentas', version: '1' })
@UseGuards(AuthGuard('jwt'), PermissionGuard)
@ApiBearerAuth()
export class PlanCuentasController {
  constructor(private readonly service: PlanCuentasService) {}

  @Get()
  @RequirePermission('CONTABILIDAD', 'CONT_PC_CUENTA_VER')
  @ApiOperation({ summary: 'Árbol completo del plan de cuentas' })
  @ApiQuery({ name: 'lista', required: false, description: 'Si true, devuelve lista plana en lugar de árbol' })
  @ApiQuery({ name: 'soloHojas', required: false, description: 'Si true, devuelve solo cuentas que aceptan movimientos' })
  getArbol(
    @GetUser() user: LoginUserInfo,
    @Query('lista') lista?: string,
    @Query('soloHojas') soloHojas?: string,
    @Query('incluirInactivas') incluirInactivas?: string,
  ) {
    const incInact = incluirInactivas === 'true';
    if (lista === 'true') return this.service.getLista(user.empresa_id, soloHojas === 'true', incInact);
    return this.service.getArbol(user.empresa_id, incInact);
  }

  @Post()
  @RequirePermission('CONTABILIDAD', 'CONT_PC_CUENTA_CREAR')
  @ApiOperation({ summary: 'Crear cuenta contable' })
  crear(
    @GetUser() user: LoginUserInfo,
    @Body() body: { codigo: string; descripcion: string; tipo: string; naturaleza: string; cuenta_padre_id?: string; acepta_cc?: boolean; moneda_fija?: string },
  ) {
    return this.service.crear(user.empresa_id, body);
  }

  @Patch(':id')
  @RequirePermission('CONTABILIDAD', 'CONT_PC_CUENTA_EDITAR')
  @ApiOperation({ summary: 'Editar cuenta contable' })
  editar(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() body: Partial<{ codigo: string; descripcion: string; tipo: string; naturaleza: string; cuenta_padre_id: string | null; acepta_cc: boolean; active: boolean; moneda_fija: string }>,
  ) {
    return this.service.editar(id, user.empresa_id, body);
  }

  @Delete(':id')
  @RequirePermission('CONTABILIDAD', 'CONT_PC_CUENTA_ELIMINAR')
  @ApiOperation({ summary: 'Eliminar cuenta contable (solo sin movimientos)' })
  eliminar(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.eliminar(id, user.empresa_id);
  }

  @Post('seed')
  @RequirePermission('CONTABILIDAD', 'CONT_PC_CUENTA_IMPORTAR')
  @ApiOperation({ summary: 'Cargar plan de cuentas Paraguay + mapeo default para la empresa' })
  cargarSeed(@GetUser() user: LoginUserInfo) {
    return this.service.cargarSeed(user.empresa_id);
  }
}
