import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  UseGuards,
  HttpCode,
  HttpStatus,
} from '@nestjs/common';
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { CurrentUser } from '@common/decorators/current-user.decorator';
import type { CurrentUserPayload } from '@common/decorators/current-user.decorator';
import { PartsService } from './services/parts.service';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';
import {
  CreatePartDto,
  UpdatePartDto,
  QueryPartsDto,
  BulkImportPartsDto,
} from './dto/part.dto';

@Controller('parts')
export class PartsController {
  constructor(private readonly partsService: PartsService) {}

  // ============================================
  // 1. 列表和批量操作
  // ============================================

  /**
   * 查询零件列表
   */
  @Get()
  @RequirePermissions('parts:read')
  async findAll(@Query() query: QueryPartsDto) {
    return this.partsService.findAll(query);
  }

  /**
   * 创建零件
   */
  @Post()
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:create')
  async create(@Body() createPartDto: CreatePartDto, @CurrentUser() user: CurrentUserPayload) {
    return this.partsService.create(createPartDto, user.userId);
  }

  /**
   * 批量导入零件
   */
  @Post('bulk-import')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:create')
  async bulkImport(@Body() bulkImportDto: BulkImportPartsDto, @CurrentUser() user: CurrentUserPayload) {
    return this.partsService.bulkImport(
      bulkImportDto,
      user.userId,
      user.username,
    );
  }

  // ============================================
  // 2. 统计和元数据（具体路径，必须在 :id 之前）
  // ============================================

  /**
   * 获取库存统计
   */
  @Get('stats/inventory')
  @RequirePermissions('parts:read')
  async getInventoryStats(
    @Query('station') station?: string,
    @Query('warehouseLocation') warehouseLocation?: string,
    @Query('category') category?: string,
  ) {
    return this.partsService.getInventoryStats({
      station,
      warehouseLocation,
      category,
    });
  }

  /**
   * 获取所有分类
   */
  @Get('meta/categories')
  @RequirePermissions('parts:read')
  async getCategories() {
    return this.partsService.getCategories();
  }

  /**
   * 获取所有工位
   */
  @Get('meta/stations')
  @RequirePermissions('parts:read')
  async getStations() {
    return this.partsService.getStations();
  }

  /**
   * 获取所有仓位
   */
  @Get('meta/warehouse-locations')
  @RequirePermissions('parts:read')
  async getWarehouseLocations() {
    return this.partsService.getWarehouseLocations();
  }

  // ============================================
  // 3. CRUD 操作（使用统一标识符，支持 UUID/编号/条码）
  // ============================================

  /**
   * 获取零件详情
   * 支持通过 UUID、零件编号、二维码或条码查询
   */
  @Get(':partIdentifier')
  @RequirePermissions('parts:read')
  async findOne(@Param('partIdentifier') partIdentifier: string) {
    return this.partsService.findByIdentifier(partIdentifier);
  }

  /**
   * 更新零件
   * 支持通过 UUID、零件编号、二维码或条码指定
   */
  @Put(':partIdentifier')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async update(
    @Param('partIdentifier') partIdentifier: string,
    @Body() updatePartDto: UpdatePartDto,
    @CurrentUser() user: CurrentUserPayload,
  ) {
    return this.partsService.updateByIdentifier(partIdentifier, updatePartDto, user.userId);
  }

  /**
   * 删除零件
   * 支持通过 UUID、零件编号、二维码或条码指定
   */
  @Delete(':partIdentifier')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:delete')
  @HttpCode(HttpStatus.NO_CONTENT)
  async remove(@Param('partIdentifier') partIdentifier: string, @CurrentUser() user: CurrentUserPayload) {
    return this.partsService.removeByIdentifier(partIdentifier, user.userId);
  }
}

