import { Entity, Column, Index, ManyToOne, JoinColumn, Check } from 'typeorm';
import { BaseEntity } from '../database/base.entity';
import { QueryQuoteHotelEntity } from './query-quote-hotel.entity';

/**
 * Quote-side twin of BookingHotelExtraEntity. See that file for the
 * shape rationale.
 */
@Entity('query_quote_hotel_extras')
@Index(
  'ix_query_quote_hotel_extras_tenant_item',
  ['tenant_id', 'hotel_item_id'],
  { where: '"is_deleted" = false' },
)
@Index(
  'ux_query_quote_hotel_extras_item_sort',
  ['hotel_item_id', 'sort_order'],
  { unique: true, where: '"is_deleted" = false' },
)
@Check(
  'ck_query_quote_hotel_extras_kind',
  `"kind" IN ('AWEB','CNB','CUSTOM')`,
)
@Check('ck_query_quote_hotel_extras_qty', '"quantity" >= 0')
@Check('ck_query_quote_hotel_extras_rate_non_neg', '"rate" >= 0')
@Check(
  'ck_query_quote_hotel_extras_nights_range',
  `"nights" = '{}'::integer[] OR (0 <= ALL("nights") AND 99 >= ALL("nights"))`,
)
export class QueryQuoteHotelExtraEntity extends BaseEntity {
  @ManyToOne(() => QueryQuoteHotelEntity, (h) => h.extras, {
    onDelete: 'CASCADE',
  })
  @JoinColumn({ name: 'hotel_item_id' })
  hotel_item: QueryQuoteHotelEntity;

  @Column({ type: 'uuid' })
  hotel_item_id: string;

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

  @Column({ type: 'varchar', length: 20 })
  kind: 'AWEB' | 'CNB' | 'CUSTOM';

  @Column({ type: 'varchar', length: 200, nullable: true })
  description: string | null;

  @Column({ type: 'int', default: 1 })
  quantity: number;

  @Column({ type: 'decimal', precision: 12, scale: 2, default: 0 })
  rate: number;

  @Column({ type: 'integer', array: true, default: () => "'{}'::integer[]" })
  nights: number[];

  @Column({ type: 'boolean', default: false })
  scale_by_rooms: boolean;
}
