import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseUUIDPipe,
  Patch,
  Post,
  Query,
} from '@nestjs/common';
import { SavingsService } from './savings.service';
import { CurrentUser } from '../../common/decorators/current-user.decorator';
import { RequirePermissions } from '../../common/decorators/permissions.decorator';

@Controller('savings')
export class SavingsController {
  constructor(private readonly svc: SavingsService) {}

  @Get()
  @RequirePermissions('savings.view')
  findAll(
    @Query('q') q?: string,
    @Query('status') status?: string,
    @Query('accountType') accountType?: string,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
  ) {
    return this.svc.findAll({
      q,
      status,
      accountType,
      page: page ? +page : 1,
      limit: limit ? +limit : 50,
    });
  }

  @Get(':id')
  @RequirePermissions('savings.view')
  findOne(@Param('id', new ParseUUIDPipe()) id: string) {
    return this.svc.findOne(id);
  }

  @Get(':id/transactions')
  @RequirePermissions('savings.view')
  transactions(
    @Param('id', new ParseUUIDPipe()) id: string,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
  ) {
    return this.svc.findTransactions(id, {
      page: page ? +page : 1,
      limit: limit ? +limit : 50,
    });
  }

  @Post()
  @RequirePermissions('savings.create')
  create(@Body() dto: any, @CurrentUser() user: { id: string }) {
    return this.svc.create(dto, user?.id);
  }

  @Patch(':id')
  @RequirePermissions('savings.update')
  update(@Param('id', new ParseUUIDPipe()) id: string, @Body() dto: any) {
    return this.svc.update(id, dto);
  }

  @Post(':id/deposit')
  @RequirePermissions('savings.create')
  deposit(
    @Param('id', new ParseUUIDPipe()) id: string,
    @Body() dto: any,
    @CurrentUser() user: { id: string },
  ) {
    return this.svc.transact(id, { ...dto, type: 'deposit' }, user?.id);
  }

  @Post(':id/withdraw')
  @RequirePermissions('savings.create')
  withdraw(
    @Param('id', new ParseUUIDPipe()) id: string,
    @Body() dto: any,
    @CurrentUser() user: { id: string },
  ) {
    return this.svc.transact(id, { ...dto, type: 'withdrawal' }, user?.id);
  }

  @Delete(':id')
  @RequirePermissions('savings.delete')
  remove(@Param('id', new ParseUUIDPipe()) id: string) {
    return this.svc.remove(id);
  }
}
