import type { StorageAdapter } from '../storage/adapter';
import type { KeyPair } from '../utils/jwt';

export interface OIDCProviderConfig {
    /** 发行者标识符 */
    issuer: string;
    /** 签名密钥（HMAC字符串）或密钥对（RSA）- 如果未提供将自动生成RSA密钥对 */
    signingKey?: string | KeyPair;
    /** 存储适配器实例（仅用于令牌存储） */
    storage: StorageAdapter;
    /** 查找用户的回调函数 */
    findUser: (userId: string) => Promise<OIDCUser | null>;
    /** 获取客户端的回调函数 */
    findClient: (clientId: string) => Promise<OIDCClient | null>;
    /** 认证配置选项 - 必须配置 */
    authConfig: {
        /** 密码验证器 - 用于验证用户名和密码，必须配置 */
        passwordValidator: PasswordValidator;
        /** 会话TTL（秒） */
        sessionTTL?: number;
        /** 页面配置 */
        pageConfig?: {
            /** 登录页面标题 */
            title?: string;
            /** 品牌名称 */
            brandName?: string;
            /** 品牌Logo URL */
            logoUrl?: string;
        };
        /** 记住我功能的最大时长（秒） */
        rememberMeMaxAge?: number;
    };
    /** 令牌过期时间配置 */
    tokenTTL?: {
        accessToken?: number; // 默认 3600 秒
        refreshToken?: number; // 默认 30 天
        authorizationCode?: number; // 默认 600 秒
        idToken?: number; // 默认 3600 秒
    };
    /** 支持的响应类型 */
    responseTypes?: string[];
    /** 支持的授权类型 */
    grantTypes?: string[];
    /** 支持的作用域 */
    scopes?: string[];
    /** 支持的声明 */
    claims?: string[];
    /** 是否启用PKCE */
    enablePKCE?: boolean;
    /** 是否强制要求PKCE（针对public客户端） */
    requirePKCE?: boolean;
    /** 是否启用刷新令牌轮换 */
    rotateRefreshTokens?: boolean;
}

export interface OIDCClient {
    /** 客户端ID */
    client_id: string;
    /** 客户端密钥 */
    client_secret?: string;
    /** 重定向URI列表 */
    redirect_uris: string[];
    /** 客户端名称 */
    client_name?: string;
    /** 客户端类型 */
    client_type: 'public' | 'confidential';
    /** 支持的授权类型 */
    grant_types: string[];
    /** 支持的响应类型 */
    response_types: string[];
    /** 支持的作用域 */
    scopes: string[];
    /** 令牌端点认证方法 */
    token_endpoint_auth_method?: string;
    /** 创建时间 */
    created_at: Date;
    /** 更新时间 */
    updated_at: Date;
}

export interface OIDCUser {
    /** 用户ID */
    sub: string;
    /** 用户名 */
    username?: string;
    /** 邮箱 */
    email?: string;
    /** 邮箱是否已验证 */
    email_verified?: boolean;
    /** 姓名 */
    name?: string;
    /** 名字 */
    given_name?: string;
    /** 姓氏 */
    family_name?: string;
    /** 头像 */
    picture?: string;
    /** 个人资料 */
    profile?: string;
    /** 网站 */
    website?: string;
    /** 性别 */
    gender?: string;
    /** 生日 */
    birthdate?: string;
    /** 时区 */
    zoneinfo?: string;
    /** 语言 */
    locale?: string;
    /** 电话号码 */
    phone_number?: string;
    /** 电话号码是否已验证 */
    phone_number_verified?: boolean;
    /** 地址 */
    address?: {
        formatted?: string;
        street_address?: string;
        locality?: string;
        region?: string;
        postal_code?: string;
        country?: string;
    };
    /** 更新时间 */
    updated_at?: number;
    /** 自定义声明 */
    [key: string]: any;
}

export interface AuthorizationCode {
    /** 授权码 */
    code: string;
    /** 客户端ID */
    client_id: string;
    /** 用户ID */
    user_id: string;
    /** 重定向URI */
    redirect_uri: string;
    /** 作用域 */
    scope: string;
    /** PKCE代码挑战 */
    code_challenge?: string;
    /** PKCE代码挑战方法 */
    code_challenge_method?: string;
    /** 随机数 */
    nonce?: string;
    /** 状态 */
    state?: string;
    /** 过期时间 */
    expires_at: Date;
    /** 创建时间 */
    created_at: Date;
}

export interface AccessToken {
    /** 访问令牌 */
    token: string;
    /** 客户端ID */
    client_id: string;
    /** 用户ID */
    user_id: string;
    /** 作用域 */
    scope: string;
    /** 过期时间 */
    expires_at: Date;
    /** 创建时间 */
    created_at: Date;
}

export interface RefreshToken {
    /** 刷新令牌 */
    token: string;
    /** 客户端ID */
    client_id: string;
    /** 用户ID */
    user_id: string;
    /** 作用域 */
    scope: string;
    /** 过期时间 */
    expires_at: Date;
    /** 创建时间 */
    created_at: Date;
}

export interface IDToken {
    /** ID令牌 */
    token: string;
    /** 客户端ID */
    client_id: string;
    /** 用户ID */
    user_id: string;
    /** 随机数 */
    nonce?: string;
    /** 过期时间 */
    expires_at: Date;
    /** 创建时间 */
    created_at: Date;
}

export interface AuthorizationRequest {
    /** 响应类型 */
    response_type: string;
    /** 客户端ID */
    client_id: string;
    /** 重定向URI */
    redirect_uri: string;
    /** 作用域 */
    scope: string;
    /** 状态 */
    state?: string;
    /** 随机数 */
    nonce?: string;
    /** PKCE代码挑战 */
    code_challenge?: string;
    /** PKCE代码挑战方法 */
    code_challenge_method?: 'plain' | 'S256';
    /** 提示 */
    prompt?: string;
    /** 最大年龄 */
    max_age?: number;
    /** ID令牌提示 */
    id_token_hint?: string;
    /** 登录提示 */
    login_hint?: string;
    /** ACR值 */
    acr_values?: string;
}

export interface TokenRequest {
    /** 授权类型 */
    grant_type: string;
    /** 授权码 */
    code?: string;
    /** 重定向URI */
    redirect_uri?: string;
    /** 客户端ID */
    client_id: string;
    /** 客户端密钥 */
    client_secret?: string;
    /** 刷新令牌 */
    refresh_token?: string;
    /** 作用域 */
    scope?: string;
    /** PKCE代码验证器 */
    code_verifier?: string;
}

export interface TokenResponse {
    /** 访问令牌 */
    access_token: string;
    /** 令牌类型 */
    token_type: string;
    /** 过期时间（秒） */
    expires_in: number;
    /** 刷新令牌 */
    refresh_token?: string;
    /** ID令牌 */
    id_token?: string;
    /** 作用域 */
    scope?: string;
}

export interface OIDCError {
    /** 错误代码 */
    error: string;
    /** 错误描述 */
    error_description?: string;
    /** 错误URI */
    error_uri?: string;
    /** 状态 */
    state?: string;
}

export interface DiscoveryDocument {
    /** 发行者 */
    issuer: string;
    /** 授权端点 */
    authorization_endpoint: string;
    /** 令牌端点 */
    token_endpoint: string;
    /** 用户信息端点 */
    userinfo_endpoint: string;
    /** JWKS URI */
    jwks_uri: string;
    /** 注册端点 */
    registration_endpoint?: string;
    /** 撤销端点 */
    revocation_endpoint?: string;
    /** 内省端点 */
    introspection_endpoint?: string;
    /** 结束会话端点 */
    end_session_endpoint?: string;
    /** 支持的响应类型 */
    response_types_supported: string[];
    /** 支持的授权类型 */
    grant_types_supported: string[];
    /** 支持的作用域 */
    scopes_supported: string[];
    /** 支持的声明 */
    claims_supported: string[];
    /** 支持的令牌端点认证方法 */
    token_endpoint_auth_methods_supported: string[];
    /** 支持的签名算法 */
    id_token_signing_alg_values_supported: string[];
    /** 支持的主题类型 */
    subject_types_supported: string[];
    /** 支持的代码挑战方法 */
    code_challenge_methods_supported?: string[];
    /** 支持的响应模式 */
    response_modes_supported?: string[];
    /** 是否支持claims参数 */
    claims_parameter_supported?: boolean;
    /** 是否支持request参数 */
    request_parameter_supported?: boolean;
    /** 是否支持request_uri参数 */
    request_uri_parameter_supported?: boolean;
    /** 是否要求注册request_uri */
    require_request_uri_registration?: boolean;
}

/**
 * 用户会话接口
 */
export interface UserSession {
    /** 会话ID */
    session_id: string;
    /** 用户ID */
    user_id: string;
    /** 客户端ID */
    client_id?: string;
    /** 认证时间 */
    auth_time: number;
    /** 认证上下文类引用 */
    acr?: string;
    /** 认证方法引用 */
    amr?: string[];
    /** 过期时间 */
    expires_at: Date;
    /** 创建时间 */
    created_at: Date;
    /** 授权参数（用于重定向） */
    authorization_params?: AuthorizationRequest;
}

/**
 * 登录凭据接口
 */
export interface LoginCredentials {
    /** 用户名 */
    username: string;
    /** 密码 */
    password: string;
    /** 记住我 */
    remember_me?: boolean;
}

/**
 * 密码验证函数类型
 */
export type PasswordValidator = (username: string, password: string) => Promise<string | null>; 