import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  ParseUUIDPipe,
} from '@nestjs/common';
import { StationService } from '../services/station.service';
import {
  CreateStationDto,
  UpdateStationDto,
  QueryStationDto,
  BulkImportStationsDto,
} from '../dto/station.dto';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';

@Controller('stations')
export class StationController {
  constructor(private readonly stationService: StationService) {}

  @Post()
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async create(@Body() dto: CreateStationDto) {
    return this.stationService.create(dto);
  }

  @Get()
  @RequirePermissions('parts:read')
  async findAll(@Query() query: QueryStationDto) {
    return this.stationService.findAll(query);
  }

  @Get('select')
  @RequirePermissions('parts:read')
  async getSelectOptions() {
    return this.stationService.getSelectOptions();
  }

  @Get('areas')
  @RequirePermissions('parts:read')
  async getAreas() {
    return this.stationService.getAreas();
  }

  @Get('lines')
  @RequirePermissions('parts:read')
  async getLines(@Query('area') area?: string) {
    return this.stationService.getLines(area);
  }

  @Get('types')
  @RequirePermissions('parts:read')
  async getTypes() {
    return this.stationService.getTypes();
  }

  @Get('import-template')
  @RequirePermissions('parts:read')
  async getImportTemplate() {
    return this.stationService.getImportTemplate();
  }

  @Post('bulk-import')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async bulkImport(@Body() dto: BulkImportStationsDto) {
    return this.stationService.bulkImport(dto.stations);
  }

  @Get(':id')
  @RequirePermissions('parts:read')
  async findOne(@Param('id', ParseUUIDPipe) id: string) {
    return this.stationService.findOne(id);
  }

  @Put(':id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async update(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: UpdateStationDto,
  ) {
    return this.stationService.update(id, dto);
  }

  @Delete(':id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async remove(@Param('id', ParseUUIDPipe) id: string) {
    return this.stationService.remove(id);
  }
}
