// expense.controller.ts
import {
  Controller,
  Get,
  Post,
  Body,
  Param,
  Delete,
  Put,
  Req,
  UseGuards,
  Patch,
} from '@nestjs/common';
import { ExpenseService } from './expense.service';
import { CreateExpenseDto } from './dto/create-expense.dto';
import { UpdateExpenseDto } from './dto/update-expense.dto';
import { RejectExpenseDto } from './dto/reject-expense.dto';
import {
  TripMember,
  TripAdmin,
} from '@/auth/decorator/permission.decorator';
import { JwtAuthGuard } from '@/auth/guards/jwt-auth/jwt-auth.guard';

@UseGuards(JwtAuthGuard)
@Controller('expenses')
export class ExpenseController {
  constructor(private readonly expenseService: ExpenseService) {}

  @Post(':tripId')
  @TripMember()
  create(
    @Body() dto: CreateExpenseDto,
    @Req() req,
  ) {
    return this.expenseService.create(req.trip, dto, req);
  }

  @Get(':tripId')
  @TripMember()
  findByTrip(@Param('tripId') tripId: string) {
    return this.expenseService.findByTrip(tripId);
  }

  @Get(':tripId/:id')
  @TripMember()
  findOne(@Param('id') id: string) {
    return this.expenseService.findOne(id);
  }

  @Patch(':tripId/:id')
  @TripMember()
  update(@Param('id') id: string, @Body() dto: UpdateExpenseDto, @Req() req) {
    return this.expenseService.update(req.trip, id, dto, req.user.id, req);
  }

  @Delete(':tripId/:id')
  @TripMember()
  remove(@Param('id') id: string, @Req() req) {
    return this.expenseService.remove(id, req.user.id);
  }

  @Post(':tripId/:id/approval')
  @TripAdmin()
  approve(@Param('id') id: string, @Req() req) {
    return this.expenseService.approve(req.trip, id, req.user.id);
  }

  @Post(':tripId/:id/reject')
  @TripAdmin()
  reject(@Param('id') id: string, @Req() req, @Body() dto: RejectExpenseDto) {
    return this.expenseService.reject(req.trip, id, req.user.id, dto.reason);
  }
}