import {
  Entity, PrimaryColumn, Column, CreateDateColumn, ManyToOne, JoinColumn,
} from 'typeorm';
import { Booking } from './Booking.entity';
import { CalendarConnection } from './CalendarConnection.entity';

export type SyncStatus = 'pending' | 'synced' | 'failed' | 'deleted';

@Entity('calendar_event_syncs')
export class CalendarEventSync {
  @PrimaryColumn('char', { length: 36 })
  id!: string;

  @Column({ name: 'booking_id', type: 'char', length: 36 })
  bookingId!: string;

  @Column({ name: 'connection_id', type: 'char', length: 36 })
  connectionId!: string;

  @Column({ name: 'external_calendar_id', length: 255 })
  externalCalendarId!: string;

  @Column({ name: 'external_event_id', length: 512 })
  externalEventId!: string;

  @Column({
    name: 'sync_status',
    type: 'enum',
    enum: ['pending', 'synced', 'failed', 'deleted'],
    default: 'pending',
  })
  syncStatus!: SyncStatus;

  @Column({ name: 'last_error', type: 'text', nullable: true })
  lastError!: string | null;

  @Column({ name: 'synced_at', type: 'datetime', precision: 3, nullable: true })
  syncedAt!: Date | null;

  @CreateDateColumn({ name: 'created_at', type: 'datetime', precision: 3 })
  createdAt!: Date;

  @ManyToOne(() => Booking, (b) => b.calendarSyncs, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'booking_id' })
  booking!: Booking;

  @ManyToOne(() => CalendarConnection, (c) => c.eventSyncs, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'connection_id' })
  connection!: CalendarConnection;
}
