import {
  Entity, PrimaryColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn, OneToMany,
} from 'typeorm';
import { User } from './User.entity';
import { CalendarEventSync } from './CalendarEventSync.entity';

export type CalendarProvider = 'google' | 'microsoft' | 'apple';
export type ConnectionStatus = 'connected' | 'expired' | 'error' | 'disconnected';

export interface CalendarConfigItem {
  externalId: string;
  name: string;
  checkConflicts: boolean;
  writeTarget: boolean;
}

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

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

  @Column({ type: 'enum', enum: ['google', 'microsoft', 'apple'] })
  provider!: CalendarProvider;

  @Column({ name: 'provider_account_email', length: 255 })
  providerAccountEmail!: string;

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

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

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

  @Column({ name: 'calendar_config', type: 'json', default: () => "'[]'" })
  calendarConfig!: CalendarConfigItem[];

  @Column({
    type: 'enum',
    enum: ['connected', 'expired', 'error', 'disconnected'],
    default: 'connected',
  })
  status!: ConnectionStatus;

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

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

  @UpdateDateColumn({ name: 'updated_at', type: 'datetime', precision: 3 })
  updatedAt!: Date;

  @ManyToOne(() => User, (u) => u.calendarConnections, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'user_id' })
  user!: User;

  @OneToMany(() => CalendarEventSync, (s) => s.connection)
  eventSyncs!: CalendarEventSync[];
}
