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 { ColumnConfigService } from './services/column-config.service';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';
import {
  CreateColumnConfigDto,
  UpdateColumnConfigDto,
  QueryColumnConfigDto,
  CopyColumnConfigDto,
} from './dto/column-config.dto';

@Controller('parts/columns/configs')
export class ColumnConfigController {
  constructor(private readonly columnConfigService: ColumnConfigService) {}

  @Get()
  @RequirePermissions('parts:read')
  async findAll(
    @Query() query: QueryColumnConfigDto,
    @CurrentUser() user: CurrentUserPayload,
  ) {
    return this.columnConfigService.findAll(user.userId, query);
  }

  @Get('default')
  @RequirePermissions('parts:read')
  async getDefault(@CurrentUser() user: CurrentUserPayload) {
    const userDefault = await this.columnConfigService.getDefault(user.userId);
    if (userDefault) {
      return userDefault;
    }
    // 如果用户没有默认配置，返回系统默认
    return this.columnConfigService.getSystemDefault();
  }

  @Get(':id')
  @RequirePermissions('parts:read')
  async findOne(@Param('id') id: string, @CurrentUser() user: CurrentUserPayload) {
    return this.columnConfigService.findOne(id, user.userId);
  }

  @Post()
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async create(
    @Body() createDto: CreateColumnConfigDto,
    @CurrentUser() user: CurrentUserPayload,
  ) {
    return this.columnConfigService.create(createDto, user.userId);
  }

  @Put(':id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async update(
    @Param('id') id: string,
    @Body() updateDto: UpdateColumnConfigDto,
    @CurrentUser() user: CurrentUserPayload,
  ) {
    return this.columnConfigService.update(id, updateDto, user.userId);
  }

  @Delete(':id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  @HttpCode(HttpStatus.NO_CONTENT)
  async remove(@Param('id') id: string, @CurrentUser() user: CurrentUserPayload) {
    return this.columnConfigService.remove(id, user.userId);
  }

  @Post(':id/set-default')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async setDefault(@Param('id') id: string, @CurrentUser() user: CurrentUserPayload) {
    return this.columnConfigService.setDefault(id, user.userId);
  }

  @Post(':id/copy')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:update')
  async copy(
    @Param('id') id: string,
    @Body() copyDto: CopyColumnConfigDto,
    @CurrentUser() user: CurrentUserPayload,
  ) {
    return this.columnConfigService.copy(id, copyDto, user.userId);
  }
}

