import { Controller, Get, Post, Put, Delete, Body, Param, Query } from '@nestjs/common';
import { Roles } from '../../../common/decorators/roles.decorator';
import { CurrentUser, AuthenticatedUser } from '../../../common/decorators/current-user.decorator';
import { BankService } from '../services/bank.service';
import { CreateBankAccountDto, UpdateBankAccountDto, CreateBankTransactionDto, UpdateBankTransactionStatusDto } from '../dto/bank.dto';

@Controller('bank')
export class BankController {
  constructor(private readonly bankService: BankService) {}

  @Roles('SUPERADMIN', 'SYNDIC')
  @Get('accounts')
  async getAccounts(@CurrentUser() user: AuthenticatedUser, @Query('complexId') complexId: string) {
    return this.bankService.getAccounts(user.tenantId!, complexId);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Post('accounts')
  async createAccount(@CurrentUser() user: AuthenticatedUser, @Body() dto: CreateBankAccountDto) {
    return this.bankService.createAccount(user.tenantId!, dto);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Get('accounts/:id')
  async getAccount(@CurrentUser() user: AuthenticatedUser, @Param('id') id: string) {
    return this.bankService.getAccount(user.tenantId!, id);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Put('accounts/:id')
  async updateAccount(@CurrentUser() user: AuthenticatedUser, @Param('id') id: string, @Body() dto: UpdateBankAccountDto) {
    return this.bankService.updateAccount(user.tenantId!, id, dto);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Delete('accounts/:id')
  async deleteAccount(@CurrentUser() user: AuthenticatedUser, @Param('id') id: string) {
    return this.bankService.deleteAccount(user.tenantId!, id);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Get('accounts/:id/transactions')
  async getTransactions(@CurrentUser() user: AuthenticatedUser, @Param('id') id: string) {
    return this.bankService.getTransactions(user.tenantId!, id);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Post('transactions')
  async addTransaction(@CurrentUser() user: AuthenticatedUser, @Body() dto: CreateBankTransactionDto) {
    return this.bankService.addTransaction(user.tenantId!, dto);
  }

  @Roles('SUPERADMIN', 'SYNDIC')
  @Put('transactions/:id/status')
  async updateTransactionStatus(@CurrentUser() user: AuthenticatedUser, @Param('id') id: string, @Body() dto: UpdateBankTransactionStatusDto) {
    return this.bankService.updateTransactionStatus(user.tenantId!, id, user.userId, dto);
  }
}
