import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  ParseIntPipe,
  UseGuards,
} from '@nestjs/common';
import { SettlementsService } from './settlements.service';
import { CreateSettlementDto } from './dto/create-settlement.dto';
import { UpdateSettlementDto } from './dto/update-settlement.dto';
import { AddPaymentDto } from './dto/add-payment.dto';
import { PaginationDto } from '../../common/dto/pagination.dto';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { CurrentUser } from '../../common/decorators/current-user.decorator';

@Controller('settlements')
@UseGuards(JwtAuthGuard)
export class SettlementsController {
  constructor(private readonly settlementsService: SettlementsService) {}

  @Get()
  findAll(
    @CurrentUser() user: { id: number; email: string },
    @Query() query: PaginationDto & { status?: string },
  ) {
    return this.settlementsService.findAll(user.id, query);
  }

  @Get('calendar')
  getCalendar(
    @CurrentUser() user: { id: number; email: string },
    @Query('year', ParseIntPipe) year: number,
    @Query('month', ParseIntPipe) month: number,
  ) {
    return this.settlementsService.getCalendar(user.id, year, month);
  }

  @Get('summary')
  getSummary(@CurrentUser() user: { id: number; email: string }) {
    return this.settlementsService.getSummary(user.id);
  }

  @Get(':id')
  findOne(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
  ) {
    return this.settlementsService.findOne(user.id, id);
  }

  @Post()
  create(
    @CurrentUser() user: { id: number; email: string },
    @Body() dto: CreateSettlementDto,
  ) {
    return this.settlementsService.create(user.id, dto);
  }

  @Put(':id')
  update(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
    @Body() dto: UpdateSettlementDto,
  ) {
    return this.settlementsService.update(user.id, id, dto);
  }

  @Delete(':id')
  remove(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
  ) {
    return this.settlementsService.remove(user.id, id);
  }

  @Post(':id/payments')
  addPayment(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
    @Body() dto: AddPaymentDto,
  ) {
    return this.settlementsService.addPayment(user.id, id, dto);
  }

  @Delete(':id/payments/:paymentId')
  removePayment(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
    @Param('paymentId', ParseIntPipe) paymentId: number,
  ) {
    return this.settlementsService.removePayment(user.id, id, paymentId);
  }
}
