import { Controller, Get, Param, Patch, Body, Query, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { Roles } from '../common/decorators/roles.decorator';
import { RolesGuard } from '../common/guards/roles.guard';
import { OPERATIONS_ROLES } from '../common/constants/roles';
import { AdminService } from './admin.service';
import { FuelRatesService } from '../settings/fuel-rates.service';
import type {
  BikeFuelRatesRecord,
  CarFuelRatesRecord,
} from '../settings/fuel-rates.util';

@ApiTags('admin')
@ApiBearerAuth('access-token')
@Controller('admin')
@UseGuards(RolesGuard)
@Roles(...OPERATIONS_ROLES)
export class AdminController {
  constructor(
    private readonly admin: AdminService,
    private readonly fuelRates: FuelRatesService,
  ) {}

  @Get('live-map')
  liveMap() {
    return this.admin.liveEmployeeMap();
  }

  @Get('active-trips')
  activeTrips() {
    return this.admin.activeTrips();
  }

  @Get('route-replay/:tripId')
  routeReplay(
    @Param('tripId') tripId: string,
    @Query('compress') compress?: string,
  ) {
    return this.admin.routeReplay(tripId, compress !== '0');
  }

  @Get('employees')
  employees(
    @Query('role') role?: string,
    @Query('status') status?: string,
    @Query('search') search?: string,
    @Query('managerId') managerId?: string,
  ) {
    return this.admin.filteredEmployees({ role, status, search, managerId });
  }

  @Get('fuel-rates')
  getFuelRates() {
    return this.fuelRates.getRates();
  }

  @Patch('fuel-rates')
  updateFuelRates(@Body() body: Record<string, unknown>) {
    const car = body.car as Record<string, unknown> | undefined;
    const bike = body.bike as Record<string, unknown> | undefined;

    const pickRate = (
      raw: Record<string, unknown>,
      key: string,
    ): number | undefined =>
      raw[key] != null ? Number(raw[key]) : undefined;

    const carPatch: Partial<CarFuelRatesRecord> = {};
    if (car) {
      const petrol = pickRate(car, 'petrolPerKm');
      const diesel = pickRate(car, 'dieselPerKm');
      const cng = pickRate(car, 'cngPerKm');
      const electric = pickRate(car, 'electricPerKm');
      if (petrol != null) carPatch.petrolPerKm = petrol;
      if (diesel != null) carPatch.dieselPerKm = diesel;
      if (cng != null) carPatch.cngPerKm = cng;
      if (electric != null) carPatch.electricPerKm = electric;
    }

    const bikePatch: Partial<BikeFuelRatesRecord> = {};
    if (bike) {
      const petrol = pickRate(bike, 'petrolPerKm');
      const electric = pickRate(bike, 'electricPerKm');
      if (petrol != null) bikePatch.petrolPerKm = petrol;
      if (electric != null) bikePatch.electricPerKm = electric;
    }

    return this.fuelRates.updateRates({
      ...(Object.keys(carPatch).length > 0 ? { car: carPatch } : {}),
      ...(Object.keys(bikePatch).length > 0 ? { bike: bikePatch } : {}),
      petrolPerKm:
        body.petrolPerKm != null ? Number(body.petrolPerKm) : undefined,
      dieselPerKm:
        body.dieselPerKm != null ? Number(body.dieselPerKm) : undefined,
      cngPerKm: body.cngPerKm != null ? Number(body.cngPerKm) : undefined,
    });
  }
}
