import {
  BaseEntity,
  Column,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  OneToMany,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { CustomerEntity } from '../../customer/entities/customer.entity';
import { BooleanTransformer } from '../../../utils/transformers/BooleanTransformer';
import {
  AvailableSection,
  DiscountEntity,
} from '../../discount/entities/discount.entity';

export enum PromotionPlanTypes {
  signupDiscount = 'signup_discount',
  birthdayDiscount = 'birthday_discount',
}

@Index('fk_promotion_plans_customers1_idx', ['customerId'], {})
@Entity('promotion_plans')
export class PromotionPlanEntity extends BaseEntity {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('varchar', { name: 'name', length: 255 })
  name: string;

  @Column('enum', {
    name: 'type',
    enum: PromotionPlanTypes,
  })
  type: PromotionPlanTypes;

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

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

  @Column('tinyint', { name: 'usePercentage', nullable: true, width: 1 })
  usePercentage: boolean | null;

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

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

  @Column('date', { name: 'startDate', nullable: true })
  startDate: string | null;

  @Column('date', { name: 'endDate', nullable: true })
  endDate: string | null;

  @Column('enum', {
    name: 'section',
    enum: AvailableSection,
    enumName: 'section',
    default: () => AvailableSection.service,
  })
  section: AvailableSection;

  @Column('tinyint', {
    name: 'deleted',
    width: 1,
    default: () => "'0'",
    transformer: new BooleanTransformer(),
  })
  deleted: boolean;

  @Column('datetime', { name: 'createdAt' })
  createdAt: Date;

  @Column('datetime', { name: 'updatedAt', nullable: true })
  updatedAt: Date | null;

  /**
   * Relations
   */
  @ManyToOne(() => CustomerEntity, (customers) => customers.promotionPlans, {
    onDelete: 'NO ACTION',
    onUpdate: 'NO ACTION',
  })
  @JoinColumn([{ name: 'customerId', referencedColumnName: 'id' }])
  customer: CustomerEntity;

  @OneToMany(() => DiscountEntity, (discounts) => discounts.promotionPlan)
  discounts: DiscountEntity[];
}
