import {
  BaseEntity,
  Column,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { DecimalTransformer } from '../../../utils/transformers/DecimalTransformer';
import { ProductEntity } from '../../product/entities/product.entity';
import { OrderEntity } from './order.entity';

@Index('orderId', ['orderId'], {})
@Index('productId', ['productId'], {})
@Entity('orderitems')
export class OrderItemEntity extends BaseEntity {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('int', { name: 'orderId' })
  orderId: number;

  @Column('char', { name: 'productId', length: 36 })
  productId: string;

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

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

  @Column('decimal', {
    name: 'tax',
    nullable: true,
    precision: 10,
    scale: 2,
    transformer: new DecimalTransformer(),
  })
  tax: number | null;

  @Column('decimal', {
    name: 'discount',
    nullable: true,
    precision: 10,
    scale: 2,
    transformer: new DecimalTransformer(),
  })
  discount: number | null;

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

  @Column('varchar', { name: 'colorName', nullable: true, length: 50 })
  colorName: string | null;

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

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

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

  /**
   * Relations
   */
  @ManyToOne(() => OrderEntity, (orders) => orders.orderItems, {
    onDelete: 'NO ACTION',
    onUpdate: 'CASCADE',
  })
  @JoinColumn([{ name: 'orderId', referencedColumnName: 'id' }])
  order: OrderEntity;

  @ManyToOne(() => ProductEntity, (products) => products.orderItems, {
    onDelete: 'NO ACTION',
    onUpdate: 'CASCADE',
  })
  @JoinColumn([{ name: 'productId', referencedColumnName: 'id' }])
  product: ProductEntity;
}
