import { Body, Controller, Get, Post, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { Throttle } from '@nestjs/throttler';
import { AuthService } from './auth.service.js';
import { AccessTokenGuard } from './access-token.guard.js';
import { CurrentActor } from './current-actor.decorator.js';
import type { ActorContext } from '../common/actor-context.js';
import { CreateSystemAdminDto } from './dto/create-system-admin.dto.js';
import { MiniappPhoneLoginDto } from './dto/miniapp-phone-login.dto.js';
import { MiniappPhoneLoginConfirmDto } from './dto/miniapp-phone-login-confirm.dto.js';
import { PasswordLoginConfirmDto } from './dto/password-login-confirm.dto.js';
import { LoginDto } from '../users/dto/login.dto.js';

/**
 * 认证控制器：提供系统管理员创建、登录、获取当前登录用户信息接口。
 */
@ApiTags('认证')
@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  /**
   * 创建系统管理员（需引导密钥）。
   */
  @Post('system-admin')
  @Throttle({ default: { limit: 3, ttl: 60_000 } })
  @ApiOperation({ summary: '创建系统管理员' })
  createSystemAdmin(@Body() dto: CreateSystemAdminDto) {
    return this.authService.createSystemAdmin(dto);
  }

  /**
   * 院内账号密码登录：后台与小程序均可复用。
   */
  @Post('login')
  @Throttle({ default: { limit: 5, ttl: 60_000 } })
  @ApiOperation({ summary: '院内账号密码登录' })
  login(@Body() dto: LoginDto) {
    return this.authService.login(dto);
  }

  @Post('login/confirm')
  @Throttle({ default: { limit: 10, ttl: 60_000 } })
  @ApiOperation({ summary: '院内账号密码多账号确认登录' })
  confirmLogin(@Body() dto: PasswordLoginConfirmDto) {
    return this.authService.confirmLogin(dto);
  }

  @Post('miniapp/b/phone-login')
  @Throttle({ default: { limit: 5, ttl: 60_000 } })
  @ApiOperation({ summary: 'B 端小程序手机号登录' })
  miniAppBLogin(@Body() dto: MiniappPhoneLoginDto) {
    return this.authService.miniAppBLogin(dto);
  }

  @Post('miniapp/b/phone-login/confirm')
  @Throttle({ default: { limit: 10, ttl: 60_000 } })
  @ApiOperation({ summary: 'B 端小程序多账号确认登录' })
  miniAppBConfirmLogin(@Body() dto: MiniappPhoneLoginConfirmDto) {
    return this.authService.miniAppBConfirmLogin(dto);
  }

  @Post('miniapp/c/phone-login')
  @Throttle({ default: { limit: 5, ttl: 60_000 } })
  @ApiOperation({ summary: 'C 端小程序手机号登录' })
  miniAppCLogin(@Body() dto: MiniappPhoneLoginDto) {
    return this.authService.miniAppCLogin(dto);
  }

  /**
   * 获取当前登录用户信息。
   */
  @Get('me')
  @UseGuards(AccessTokenGuard)
  @ApiBearerAuth('bearer')
  @ApiOperation({ summary: '获取当前用户信息' })
  me(@CurrentActor() actor: ActorContext) {
    return this.authService.me(actor);
  }
}
