import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  Index,
  CreateDateColumn,
  UpdateDateColumn,
} from 'typeorm';
import { ZoomAnalyticsResourceType } from '../enum/zoom-analytics-resource-type.enum';

/**
 * One row per session — the reconciled post-session snapshot backing the 8
 * admin-screen header KPIs. New, standalone table; upserted (update-in-place)
 * by the resource-type provider's `reconcile()`, so re-running reconciliation
 * is idempotent by construction.
 */
@Entity('zoom_analytics_session_summary')
export class ZoomAnalyticsSessionSummary {
  @PrimaryGeneratedColumn('increment', { type: 'bigint' })
  id: number;

  @Column({ name: 'program_id', type: 'int' })
  programId: number;

  @Index({ unique: true })
  @Column({ name: 'session_id', type: 'int' })
  sessionId: number;

  @Column({ name: 'online_session_id', type: 'bigint' })
  onlineSessionId: number;

  @Column({ name: 'resource_type', type: 'varchar', length: 20 })
  resourceType: ZoomAnalyticsResourceType;

  @Column({ name: 'actual_start_at', type: 'timestamptz', nullable: true })
  actualStartAt: Date | null;

  @Column({ name: 'actual_duration_minutes', type: 'int', nullable: true })
  actualDurationMinutes: number | null;

  /** Set synchronously on the webinar.ended webhook — independent of reconcile()/Report API readiness. */
  @Column({ name: 'actual_end_at', type: 'timestamptz', nullable: true })
  actualEndAt: Date | null;

  @Column({ name: 'total_panelists', type: 'int', default: 0 })
  totalPanelists: number;

  @Column({ name: 'total_joined', type: 'int', default: 0 })
  totalJoined: number;

  @Column({ name: 'not_joined', type: 'int', default: 0 })
  notJoined: number;

  @Column({ name: 'joined_late', type: 'int', default: 0 })
  joinedLate: number;

  @Column({ name: 'dropped', type: 'int', default: 0 })
  dropped: number;

  @Column({ name: 'rejoined', type: 'int', default: 0 })
  rejoined: number;

  @Column({ name: 'reconciled_at', type: 'timestamptz', nullable: true })
  reconciledAt: Date | null;

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

  @UpdateDateColumn({
    name: 'updated_at',
    type: 'timestamptz',
    default: () => 'CURRENT_TIMESTAMP',
    onUpdate: 'CURRENT_TIMESTAMP',
  })
  updatedAt: Date;

  constructor(partial?: Partial<ZoomAnalyticsSessionSummary>) {
    Object.assign(this, partial ?? {});
  }
}
