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

// 사용자 엔티티 — 인증/계정의 단일 진실 공급원
@Entity('users')
export class User {
  // 외부 노출 식별자 (UUID)
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 로그인 이메일 (유일)
  @Column({ unique: true })
  email!: string;

  // 비밀번호 해시 — 평문 저장 금지. 조회 시 기본 제외(select: false).
  // 소셜 전용 계정은 비밀번호가 없으므로 null.
  @Column({
    name: 'password_hash',
    type: 'varchar',
    nullable: true,
    select: false,
  })
  passwordHash!: string | null;

  // 가입 경로 — 'local'(이메일) | 'google' | 'kakao'. 로그인 안내·계정 연동 판별에 사용.
  @Column({ type: 'varchar', default: 'local' })
  provider!: string;

  // 이메일 인증 완료 여부 — 로컬 가입은 인증 메일 클릭 후 true, 소셜 가입은 즉시 true.
  // 미인증 로컬 계정은 로그인이 차단된다.
  @Column({ name: 'email_verified', type: 'boolean', default: false })
  emailVerified!: boolean;

  // 이메일 인증 토큰 해시(SHA-256) — 원문은 메일 링크에만 담고 DB엔 해시만 저장. 조회 기본 제외.
  @Column({
    name: 'email_verify_token_hash',
    type: 'varchar',
    nullable: true,
    select: false,
  })
  emailVerifyTokenHash!: string | null;

  // 이메일 인증 토큰 만료 시각 — 만료 후 클릭은 무효. 조회 기본 제외.
  @Column({
    name: 'email_verify_expires_at',
    type: 'timestamptz',
    nullable: true,
    select: false,
  })
  emailVerifyExpiresAt!: Date | null;

  // 비밀번호 재설정 토큰 해시(SHA-256) — 원문은 메일 링크에만, DB엔 해시만. 조회 기본 제외.
  @Column({
    name: 'password_reset_token_hash',
    type: 'varchar',
    nullable: true,
    select: false,
  })
  passwordResetTokenHash!: string | null;

  // 비밀번호 재설정 토큰 만료 시각 — 보안상 짧게(1시간). 조회 기본 제외.
  @Column({
    name: 'password_reset_expires_at',
    type: 'timestamptz',
    nullable: true,
    select: false,
  })
  passwordResetExpiresAt!: Date | null;

  // 표시 이름
  @Column()
  name!: string;

  // 전사 직무(예: '콘텐츠 기획') — 선택값
  @Column({ type: 'varchar', nullable: true })
  role!: string | null;

  // 프로필 이미지 URL — 미설정 시 null(프론트는 placeholder 표시). 업로드는 추후 단계.
  @Column({ name: 'avatar_url', type: 'varchar', nullable: true })
  avatarUrl!: string | null;

  @CreateDateColumn({ name: 'created_at' })
  createdAt!: Date;

  @UpdateDateColumn({ name: 'updated_at' })
  updatedAt!: Date;
}
