/**
 * 登录核心模块
 *
 * 功能描述：
 * - 提供登录认证的核心服务模块
 * - 集成用户数据服务和认证逻辑
 * - 为业务层提供可复用的认证功能
 * - 统一管理登录相关的依赖注入和服务配置
 *
 * 依赖模块：
 * - UsersModule: 用户数据访问服务
 * - EmailModule: 邮件发送服务
 * - VerificationModule: 验证码管理服务
 * - JwtModule: JWT令牌生成和验证服务
 * - ConfigModule: 配置管理服务
 *
 * 导出服务：
 * - LoginCoreService: 登录核心业务逻辑服务
 *
 * 最近修改：
 * - 2026-01-12: 代码规范优化 - 提取JWT配置魔法字符串为常量 (修改者: moyin)
 * - 2026-01-07: 架构优化 - 添加JWT服务支持，将JWT技术实现从Business层移到Core层
 *
 * @author moyin
 * @version 1.1.0
 * @since 2025-12-17
 * @lastModified 2026-01-12
 */

import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { LoginCoreService } from './login_core.service';
import { UsersModule } from '../db/users/users.module';
import { EmailModule } from '../utils/email/email.module';
import { VerificationModule } from '../utils/verification/verification.module';
import { SessionCoreModule } from '../session_core/session_core.module';

// JWT配置常量
const DEFAULT_JWT_EXPIRES_IN = '7d'; // 默认JWT过期时间
const JWT_ISSUER = 'whale-town'; // JWT签发者
const JWT_AUDIENCE = 'whale-town-users'; // JWT受众

/**
 * 登录核心模块类
 *
 * 职责：
 * - 配置登录认证相关的服务和依赖
 * - 管理用户认证功能的模块化组织
 * - 为业务层提供统一的认证服务接口
 * - 协调用户数据、邮件服务、验证码服务和JWT服务的集成
 *
 * 主要配置：
 * - imports: 导入依赖的功能模块
 * - providers: 提供登录核心服务
 * - exports: 导出服务供其他模块使用
 *
 * 使用场景：
 * - 在业务模块中导入以使用登录认证功能
 * - 作为认证相关功能的统一入口点
 * - 在应用主模块中集成认证功能
 */
@Module({
  imports: [
    UsersModule,
    EmailModule,
    VerificationModule,
    SessionCoreModule,
    JwtModule.registerAsync({
      imports: [ConfigModule],
      useFactory: (configService: ConfigService) => {
        const expiresIn = configService.get<string>('JWT_EXPIRES_IN', DEFAULT_JWT_EXPIRES_IN);
        return {
          secret: configService.get<string>('JWT_SECRET'),
          signOptions: {
            expiresIn: expiresIn as any, // JWT库支持字符串格式如 '7d'
            issuer: JWT_ISSUER,
            audience: JWT_AUDIENCE,
          },
        };
      },
      inject: [ConfigService],
    }),
    ConfigModule,
  ],
  providers: [LoginCoreService],
  exports: [LoginCoreService],
})
export class LoginCoreModule {}
