// ============================================================
// SocialAccount Entity — 第三方社交账号绑定记录
//
// 表名: social_accounts
//
// 设计思路 (主流大厂方案):
//   用 social_accounts 表存储第三方账号与系统用户的映射关系，
//   而不是在 users 表加大量字段。
//   好处：
//     - 一个用户可绑定多个第三方账号（微信 + Google + Apple）
//     - 方便扩展新的 provider，无需改 users 表
//     - 第三方 token 隔离存储，不影响主账号安全边界
//
// Provider 设计:
//   provider   — 'wechat' | 'google' | 'apple' (预留)
//   openid     — 微信中为 openid（每个应用不同），Google 中为 sub
//   unionid    — 微信专有：同一开放平台账号下所有应用共享
//               是微信跨 App 识别同一用户的唯一手段
//
// openid vs unionid (微信特有):
//   - openid: 同一用户在不同应用下不同（不能跨 App 识别用户）
//   - unionid: 绑定到微信开放平台账号后，跨所有 App 唯一
//   ⇒ 优先用 unionid 查找用户；没有 unionid 时 fallback 到 openid
//
// 用户数据来源 (nickname/avatarUrl/rawData):
//   微信提供：nickname（可能含 Emoji）、headimgurl（头像，132x132）
//   rawData: 完整 provider 响应，保留全量信息备用
//
// 生命周期:
//   新用户 WeChat 登录 → create user + create social_account
//   老用户关联微信     → 仅 create social_account（user_id 已有）
//   取消关联          → delete social_account（保留 user）
// ============================================================

import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  CreateDateColumn,
  UpdateDateColumn,
  Index,
} from 'typeorm';

/** 已支持的第三方登录 Provider */
export enum SocialProvider {
  WECHAT = 'wechat',
  ALIPAY = 'alipay',
  GOOGLE = 'google',
  APPLE = 'apple',
}

@Entity('social_accounts')
@Index('idx_social_provider_openid', ['provider', 'openid'], { unique: true })
@Index('idx_social_provider_unionid', ['provider', 'unionid'])
@Index('idx_social_user_id', ['userId'])
export class SocialAccount {
  @PrimaryGeneratedColumn('increment', { type: 'bigint' })
  id: string;

  /** 系统用户 ID（外键 → users.id） */
  @Column({ name: 'user_id', type: 'uuid' })
  userId: string;

  /** Provider 标识 */
  @Column({ type: 'varchar', length: 20 })
  provider: SocialProvider;

  /** Provider 用户唯一 ID（微信 openid，Google sub 等） */
  @Column({ type: 'varchar', length: 128 })
  openid: string;

  /**
   * 微信 unionid（跨 App 唯一标识）
   * 仅在用户将 WeChat 绑定到同一开放平台账号时有值。
   * 如果有 unionid，优先以 unionid 查找用户，避免跨 App 重复注册。
   */
  @Column({ type: 'varchar', length: 128, nullable: true })
  unionid: string | null;

  /** Provider 返回的显示名（微信昵称等） */
  @Column({ type: 'varchar', length: 100, nullable: true })
  nickname: string | null;

  /** Provider 返回的头像 URL */
  @Column({ name: 'avatar_url', type: 'varchar', length: 500, nullable: true })
  avatarUrl: string | null;

  /** Provider 完整原始响应（JSONB），保留全量字段备用 */
  @Column({ name: 'raw_data', type: 'jsonb', nullable: true })
  rawData: Record<string, unknown> | null;

  @CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
  createdAt: Date;

  @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
  updatedAt: Date;
}
