import {
  Controller,
  Get,
  Post,
  Body,
  Put,
  Patch,
  Param,
  Delete,
  Query,
  UseGuards,
} from '@nestjs/common';
import { RegionsService } from './regions.service';
import { CreateRegionDto, UpdateRegionDto, RegionQueryDto } from './dto/region.dto';
import { PermissionsGuard } from '../auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { Auditable, Sensitive } from '@core/observability/audit/decorators/auditable.decorator';

@Controller('regions')
export class RegionsController {
  constructor(private readonly regionsService: RegionsService) {}

  /**
   * Create a new region
   * Scope: all - 区域管理需要全局权限
   */
  @Post()
  @Auditable()
  @Sensitive()
  @RequirePermissions('region:create')
  create(@Body() createRegionDto: CreateRegionDto) {
    return this.regionsService.create(createRegionDto);
  }

  /**
   * Get all regions
   * 注意：改为普通权限检查，允许部门经理等角色查看区域列表
   */
  @Get()
  @RequirePermissions('region:read')
  findAll(@Query() query: RegionQueryDto) {
    return this.regionsService.findAll(query);
  }

  /**
   * Get active regions (for dropdown selection)
   */
  @Get('active')
  findActive() {
    return this.regionsService.findActive();
  }

  /**
   * Get region by ID
   * 注意：改为普通权限检查，允许部门经理查看
   */
  @Get(':id')
  @RequirePermissions('region:read')
  findOne(@Param('id') id: string) {
    return this.regionsService.findOne(id);
  }

  /**
   * Get region by code
   * 注意：改为普通权限检查，允许部门经理查看
   */
  @Get('code/:code')
  @RequirePermissions('region:read')
  findByCode(@Param('code') code: string) {
    return this.regionsService.findByCode(code);
  }

  /**
   * Get region statistics
   * 注意：改为普通权限检查，允许部门经理查看
   */
  @Get(':id/stats')
  @RequirePermissions('region:read')
  getStats(@Param('id') id: string) {
    return this.regionsService.getStats(id);
  }

  /**
   * Update region
   * Scope: all - 区域更新需要全局权限
   */
  @Patch(':id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('region:update')
  update(@Param('id') id: string, @Body() updateRegionDto: UpdateRegionDto) {
    return this.regionsService.update(id, updateRegionDto);
  }

  /**
   * Delete region
   * Scope: all - 区域删除需要全局权限
   */
  @Delete(':id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('region:delete')
  remove(@Param('id') id: string) {
    return this.regionsService.remove(id);
  }

  /**
   * Set default organization for a region
   * Scope: all - 区域配置需要全局权限
   */
  @Put(':id/default-organization')
  @Auditable()
  @Sensitive()
  @RequirePermissions('region:update')
  setDefaultOrganization(
    @Param('id') id: string,
    @Body() body: { departmentId: string | null },
  ) {
    return this.regionsService.setDefaultOrganization(id, body.departmentId);
  }
}
