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

class CreateExpenseDto {
  @IsUUID() complexId!: string;
  @IsOptional() @IsUUID() supplierId?: string;
  @IsString() category!: string;
  @IsNumber() @Min(0.01) amount!: number;
  @IsOptional() @IsString() currency?: string;
  @IsOptional() @IsString() invoiceNumber?: string;
  @IsDateString() invoiceDate!: string;
  @IsOptional() @IsString() invoicePdfUrl?: string;
  @IsOptional() @IsUUID() repartitionKeyId?: string;
  @IsOptional() @IsString() notes?: string;
}

@ApiTags('Finance — Expenses')
@ApiBearerAuth()
@Controller('expenses')
export class ExpensesController {
  constructor(private readonly expenses: ExpensesService) {}

  @Roles('SUPERADMIN', 'SYNDIC')
  @Post()
  create(@CurrentUser() user: AuthenticatedUser, @Body() dto: CreateExpenseDto) {
    return this.expenses.create(user, { ...dto, invoiceDate: new Date(dto.invoiceDate) });
  }

  @Get()
  list(
    @CurrentUser() user: AuthenticatedUser,
    @Query('complexId') complexId: string,
  ) {
    return this.expenses.list(user, complexId);
  }

  @Get('consumption')
  consumption(
    @CurrentUser() user: AuthenticatedUser,
    @Query('complexId') complexId: string,
  ) {
    return this.expenses.budgetConsumption(user, complexId);
  }

  @Get(':id')
  findOne(@CurrentUser() user: AuthenticatedUser, @Param('id') id: string) {
    return this.expenses.findOne(user, id);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Delete(':id')
  remove(@CurrentUser() user: AuthenticatedUser, @Param('id') id: string) {
    return this.expenses.remove(user, id);
  }
}
