import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  ParseUUIDPipe,
} from '@nestjs/common';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { StorageLocationService } from '../services/storage-location.service';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';
import {
  CreateStorageLocationDto,
  UpdateStorageLocationDto,
  QueryStorageLocationDto,
  BulkImportLocationsDto,
} from '../dto/storage-location.dto';

@Controller('storage-locations')
export class StorageLocationController {
  constructor(private readonly storageLocationService: StorageLocationService) {}

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

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

  @Get('by-warehouse/:warehouseId')
  @RequirePermissions('parts:read')
  async findByWarehouse(@Param('warehouseId', ParseUUIDPipe) warehouseId: string) {
    return this.storageLocationService.findByWarehouse(warehouseId);
  }

  @Get('zones')
  @RequirePermissions('parts:read')
  async getZones(@Query('warehouseId') warehouseId?: string) {
    return this.storageLocationService.getZones(warehouseId);
  }

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

  @Post('bulk-import/:warehouseId')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async bulkImport(
    @Param('warehouseId', ParseUUIDPipe) warehouseId: string,
    @Body() dto: BulkImportLocationsDto,
  ) {
    return this.storageLocationService.bulkImport(warehouseId, dto.locations as any);
  }

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

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

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