import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { IsNumber, IsOptional, IsString, IsUUID, Min } from 'class-validator';
import { BudgetLinesService } from '../services/budget-lines.service';
import { Roles } from '../../../common/decorators/roles.decorator';
import { CurrentUser, AuthenticatedUser } from '../../../common/decorators/current-user.decorator';

class UpsertBudgetDto {
  @IsNumber() @Min(0) totalAmount!: number;
}

class CreateBudgetLineDto {
  @IsString() category!: string;
  @IsUUID() repartitionKeyId!: string;
  @IsNumber() @Min(0) estimatedAmount!: number;
  @IsOptional() @IsString() notes?: string;
}

@ApiTags('Finance — Budgets')
@ApiBearerAuth()
@Controller()
export class BudgetsController {
  constructor(private readonly budgets: BudgetLinesService) {}

  @Roles('SUPERADMIN', 'SYNDIC')
  @Put('fiscal-years/:fyId/budget')
  upsertBudget(
    @CurrentUser() user: AuthenticatedUser,
    @Param('fyId') fyId: string,
    @Body() dto: UpsertBudgetDto,
  ) {
    return this.budgets.upsertBudget(user, fyId, dto);
  }

  @Get('budgets/:budgetId/lines')
  list(
    @CurrentUser() user: AuthenticatedUser,
    @Param('budgetId') budgetId: string,
  ) {
    return this.budgets.list(user, budgetId);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Post('budgets/:budgetId/lines')
  create(
    @CurrentUser() user: AuthenticatedUser,
    @Param('budgetId') budgetId: string,
    @Body() dto: CreateBudgetLineDto,
  ) {
    return this.budgets.createLine(user, budgetId, dto);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Delete('budget-lines/:id')
  remove(
    @CurrentUser() user: AuthenticatedUser,
    @Param('id') id: string,
  ) {
    return this.budgets.remove(user, id);
  }
}
