import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  UseGuards,
  ParseUUIDPipe,
} from '@nestjs/common';
import { DepartmentsService } from './departments.service';
import {
  CreateDepartmentDto,
  UpdateDepartmentDto,
  SetHeadDto,
  DepartmentQueryDto,
  BatchCreateDepartmentDto,
} from './dto/department.dto';
import { AddDepartmentMemberDto, AddDepartmentMembersDto } from './dto/add-member.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('departments')
export class DepartmentsController {
  constructor(private readonly departmentsService: DepartmentsService) {}

  /**
   * Get department list
   */
  @Get()
  async findAll(@Query() query: DepartmentQueryDto) {
    return this.departmentsService.findAll(query);
  }

  /**
   * Get department tree
   * @param organizationId - Optional: 指定顶级组织 ID，只返回该组织的部门树
   */
  @Get('tree')
  async findTree(@Query('organizationId') organizationId?: string) {
    return this.departmentsService.findTree(organizationId);
  }

  /**
   * Get top-level organizations (for perspective selection)
   * @param regionId - 可选的区域 ID
   */
  @Get('organizations')
  async findOrganizations(@Query('regionId') regionId?: string) {
    return this.departmentsService.findOrganizations(regionId);
  }

  /**
   * Get department by ID
   */
  @Get(':id')
  async findOne(@Param('id', ParseUUIDPipe) id: string) {
    return this.departmentsService.findOne(id);
  }

  /**
   * Get department members
   */
  @Get(':id/members')
  async getMembers(
    @Param('id', ParseUUIDPipe) id: string,
    @Query('includeSubDepartments') includeSubDepartments?: string,
  ) {
    const includeSub = includeSubDepartments === 'true';
    return this.departmentsService.getMembers(id, includeSub);
  }

  /**
   * Get department statistics
   */
  @Get(':id/stats')
  async getStats(@Param('id', ParseUUIDPipe) id: string) {
    return this.departmentsService.getStats(id);
  }

  /**
   * Create department
   * Scope: organization - 只能在本组织创建部门
   */
  @Post()
  @Auditable()
  @RequirePermissions('department:create')
  async create(@Body() createDepartmentDto: CreateDepartmentDto) {
    return this.departmentsService.create(createDepartmentDto);
  }

  /**
   * Batch create departments
   * Scope: organization - 只能在本组织批量创建部门
   */
  @Post('batch')
  @Auditable()
  @Sensitive()
  @RequirePermissions('department:create')
  async batchCreate(@Body() batchCreateDto: BatchCreateDepartmentDto) {
    return this.departmentsService.batchCreate(batchCreateDto);
  }

  /**
   * Update department
   * Scope: organization - 只能更新本组织部门
   */
  @Put(':id')
  @Auditable()
  @RequirePermissions('department:update')
  async update(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() updateDepartmentDto: UpdateDepartmentDto,
  ) {
    return this.departmentsService.update(id, updateDepartmentDto);
  }

  /**
   * Set department head (负责人/主管)
   */
  @Put(':id/head')
  @Auditable()
  @Sensitive()

  @RequirePermissions('department:update')
  async setHead(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() setHeadDto: SetHeadDto,
  ) {
    return this.departmentsService.setHead(id, setHeadDto.headId);
  }

  /**
   * Add single member to department
   */
  @Post(':id/members')
  @Auditable()

  @RequirePermissions('department:update')
  async addMember(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: AddDepartmentMemberDto,
  ) {
    return this.departmentsService.addMember(id, dto);
  }

  /**
   * Add multiple members to department (batch)
   */
  @Post(':id/members/batch')
  @Auditable()
  @Sensitive()

  @RequirePermissions('department:update')
  async addMembers(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: AddDepartmentMembersDto,
  ) {
    return this.departmentsService.addMembers(id, dto);
  }

  /**
   * Remove member from department
   * Scope: organization - 只能从本组织部门移除成员
   */
  @Delete(':id/members/:userId')
  @Auditable()
  @Sensitive()
  @RequirePermissions('department:update')
  async removeMember(
    @Param('id', ParseUUIDPipe) id: string,
    @Param('userId', ParseUUIDPipe) userId: string,
  ) {
    return this.departmentsService.removeMember(id, userId);
  }

  /**
   * Delete department
   * Scope: organization - 只能删除本组织部门
   */
  @Delete(':id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('department:delete')
  async remove(@Param('id', ParseUUIDPipe) id: string) {
    return this.departmentsService.remove(id);
  }
}
