import {
  Entity, PrimaryColumn, Column, UpdateDateColumn, ManyToOne, OneToOne, JoinColumn, OneToMany,
} from 'typeorm';
import { User } from './User.entity';
import { EventType } from './EventType.entity';
import { AvailabilityDateOverride } from './AvailabilityDateOverride.entity';
import type { WeeklyRule } from '../../utils/timezone';

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

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

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

  @Column({ name: 'min_notice_hours', type: 'int', default: 4 })
  minNoticeHours!: number;

  @Column({ name: 'max_advance_days', type: 'int', default: 60 })
  maxAdvanceDays!: number;

  @Column({ type: 'varchar', length: 64, default: 'UTC' })
  timezone!: string;

  @Column({ name: 'weekly_rules', type: 'json', default: () => "'[]'" })
  weeklyRules!: WeeklyRule[];

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

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

  @OneToOne(() => EventType, (et) => et.availabilitySchedule, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'event_type_id' })
  eventType!: EventType;

  @OneToMany(() => AvailabilityDateOverride, (o) => o.schedule)
  dateOverrides!: AvailabilityDateOverride[];
}
