// timeline.controller.ts
import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Req,
  UseGuards,
} from '@nestjs/common';
import { TimelineService } from './timeline.service';
import { CreateTimelineDto } from './dto/create-timeline.dto';
import { UpdateTimelineDto } from './dto/update-timeline.dto';
import { 
  TripMember,
  TripAdmin,
  TimelineAdmin,
} from '@/auth/decorator/permission.decorator';
import { JwtAuthGuard } from '@/auth/guards/jwt-auth/jwt-auth.guard';

@UseGuards(JwtAuthGuard)
@Controller('timelines')
export class TimelineController {
  constructor(private readonly timelineService: TimelineService) {}

  // =============================
  // CREATE
  // =============================
  @Post()
  @TripAdmin()
  create(@Req() req, @Body() dto: CreateTimelineDto) {
    return this.timelineService.create(req.user.id, dto);
  }

  // =============================
  // BULK CREATE
  // =============================
  @Post('bulk')
  @TripAdmin()
  createBulk(@Req() req, @Body() dto: { tripId: string; timelines: any[] }) {
    return this.timelineService.createBulk(req.user.id, dto.tripId, dto.timelines);
  }

  // =============================
  // UPDATE
  // =============================
  @Patch(':id')
  @TimelineAdmin()
  update(
    @Param('id') id: string,
    @Req() req,
    @Body() dto: UpdateTimelineDto,
  ) {
    return this.timelineService.update(id, req.user.id, dto);
  }

  // =============================
  // DELETE
  // =============================
  @Delete(':id')
  @TimelineAdmin()
  delete(@Param('id') id: string, @Req() req) {
    return this.timelineService.delete(id, req.user.id);
  }

  // =============================
  // DELETE ALL BY TRIP
  // =============================
  @Delete('trip/:tripId')
  @TripAdmin()
  deleteByTrip(@Param('tripId') tripId: string, @Req() req) {
    return this.timelineService.deleteByTrip(tripId, req.user.id);
  }

  // =============================
  // LIST
  // =============================
  @Get('trip/:tripId')
  @TripMember()
  findByTrip(@Param('tripId') tripId: string) {
    return this.timelineService.findByTrip(tripId);
  }

  // =============================
  // FIND BY ID
  // =============================
  @Get('trip/:tripId/:timelineId')
  @TripMember()
  findById(@Param('timelineId') timelineId: string) {
    return this.timelineService.findById(timelineId);
  }
}