import { Body, Controller, Delete, Get, Param, Patch, Post, Req, UseGuards } from '@nestjs/common';
import { Roles } from '../common/decorators/roles.decorator';
import { JwtAuthGuard } from '../common/guards/jwt-auth.guard';
import { RolesGuard } from '../common/guards/roles.guard';
import { UpdateDriverProfileDto } from './dto/update-driver-profile.dto';
import { UpsertDriverDto } from './dto/upsert-driver.dto';
import { DriversService } from './drivers.service';

@Controller()
@UseGuards(JwtAuthGuard, RolesGuard)
export class DriversController {
  constructor(private readonly driversService: DriversService) {}

  @Get('drivers')
  @Roles('ADMIN', 'SUPER_ADMIN')
  index() {
    return this.driversService.index();
  }

  @Post('drivers')
  @Roles('ADMIN', 'SUPER_ADMIN')
  create(@Body() body: UpsertDriverDto) {
    return this.driversService.create(body);
  }

  @Patch('drivers/:id')
  @Roles('ADMIN', 'SUPER_ADMIN')
  update(@Param('id') id: string, @Body() body: Partial<UpsertDriverDto>) {
    return this.driversService.updateAdmin(id, body);
  }

  @Delete('drivers/:id')
  @Roles('ADMIN', 'SUPER_ADMIN')
  archive(@Param('id') id: string) {
    return this.driversService.archive(id);
  }

  @Get('driver/deliveries/:id/route')
  @Roles('DRIVER')
  getRoute(@Req() req: { user: { sub: string; role: string } }, @Param('id') id: string) {
    return this.driversService.getDeliveryRoute(req.user as never, id);
  }

  @Get('driver/deliveries/active')
  @Roles('DRIVER')
  getActiveDeliveries(@Req() req: { user: { sub: string; role: string } }) {
    return this.driversService.getActiveDeliveries(req.user as never);
  }

  @Get('driver/deliveries/offers')
  @Roles('DRIVER')
  getDeliveryOffers(@Req() req: { user: { sub: string; role: string } }) {
    return this.driversService.getDeliveryOffers(req.user as never);
  }

  @Get('driver/profile')
  @Roles('DRIVER')
  getProfile(@Req() req: { user: { sub: string; role: string } }) {
    return this.driversService.getProfile(req.user as never);
  }

  @Patch('driver/profile')
  @Roles('DRIVER')
  updateProfile(@Req() req: { user: { sub: string; role: string } }, @Body() body: UpdateDriverProfileDto) {
    return this.driversService.updateOwnProfile(req.user as never, body);
  }

  @Patch('driver/deliveries/:id/accept')
  @Roles('DRIVER')
  acceptDelivery(@Req() req: { user: { sub: string; role: string } }, @Param('id') id: string) {
    return this.driversService.acceptDelivery(req.user as never, id);
  }

  @Patch('driver/deliveries/:id/reject')
  @Roles('DRIVER')
  rejectDelivery(@Req() req: { user: { sub: string; role: string } }, @Param('id') id: string) {
    return this.driversService.rejectDelivery(req.user as never, id);
  }

  @Patch('driver/status')
  @Roles('DRIVER')
  updateStatus(@Req() req: { user: { sub: string; role: string } }, @Body() body: { isOnline: boolean }) {
    return this.driversService.updateOwnStatus(req.user as never, body.isOnline);
  }

  @Patch('driver/deliveries/:id/location')
  @Roles('DRIVER')
  updateLocation(@Req() req: { user: { sub: string; role: string } }, @Param('id') id: string, @Body() body: { latitude: number; longitude: number; heading?: number; speed?: number; accuracy?: number }) {
    return this.driversService.updateLocation(req.user as never, id, body);
  }

  @Patch('driver/deliveries/:id/pickup')
  @Roles('DRIVER')
  pickup(@Req() req: { user: { sub: string; role: string } }, @Param('id') id: string, @Body() body: { confirmationCode?: string }) {
    return this.driversService.confirmPickup(req.user as never, id, body.confirmationCode);
  }

  @Patch('driver/deliveries/:id/delivered')
  @Roles('DRIVER')
  delivered(@Req() req: { user: { sub: string; role: string } }, @Param('id') id: string, @Body() body: { confirmationCode?: string; proofImageUrl?: string }) {
    return this.driversService.confirmDelivered(req.user as never, id, body);
  }
}
