import {
  Column,
  CreateDateColumn,
  Entity,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  type Relation,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';

// refresh 토큰 세션(패밀리) — 회전형 refresh 토큰 + 재사용 탐지의 단위.
// 한 로그인(기기)당 1행. id=패밀리 식별자(fid), currentJti=현재 유효한 refresh 토큰 표식.
// 갱신 시 currentJti 를 새로 발급하고, 이미 회전된(옛) 토큰이 다시 제출되면 탈취로 간주해
// 행을 삭제(패밀리 폐기)한다. 동시 갱신(재시도) 오탐 방지를 위해 직전 jti 를 짧은 유예 동안 허용.
@Entity('refresh_sessions')
export class RefreshSession {
  // 패밀리 식별자(fid) — refresh JWT payload 에 담긴다
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  @ManyToOne(() => User, { onDelete: 'CASCADE', nullable: false })
  @JoinColumn({ name: 'user_id' })
  user!: Relation<User>;

  // 현재 유효한 refresh 토큰의 jti
  @Column({ name: 'current_jti', type: 'uuid' })
  currentJti!: string;

  // 직전 jti + 회전 시각 — 동시 갱신(재시도) 유예 판정용
  @Column({ name: 'prev_jti', type: 'uuid', nullable: true })
  prevJti!: string | null;

  @Column({ name: 'prev_at', type: 'timestamptz', nullable: true })
  prevAt!: Date | null;

  // 세션 만료(refresh TTL) — 만료분 정리용
  @Column({ name: 'expires_at', type: 'timestamptz' })
  expiresAt!: Date;

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