import {
  BaseEntity,
  Column,
  Entity,
  OneToMany,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { BooleanTransformer } from '../../../utils/transformers/BooleanTransformer';
import { ProductEntity } from '../../product/entities/product.entity';
import { CategoryDiscountMappingEntity } from './category-discount-mapping.entity';

@Entity('categories')
export class CategoryEntity extends BaseEntity {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

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

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

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

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

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

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

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

  @Column('varchar', {
    name: 'image',
    length: 255,
    default: () => "'/images/no-photo.jpg'",
  })
  image: string;

  @Column('tinyint', {
    name: 'showOnHomePage',
    nullable: true,
    width: 1,
    transformer: new BooleanTransformer(),
  })
  showOnHomePage: boolean | null;

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

  @Column('tinyint', {
    name: 'published',
    nullable: true,
    width: 1,
    transformer: new BooleanTransformer(),
  })
  published: boolean | null;

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

  @Column('tinyint', {
    name: 'isService',
    nullable: true,
    width: 1,
    default: () => "'0'",
    transformer: new BooleanTransformer(),
  })
  isService: boolean | null;

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

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

  /**
   * Relations
   */
  @OneToMany(
    () => CategoryDiscountMappingEntity,
    (categoryDiscountMappings) => categoryDiscountMappings.category,
  )
  categoryDiscountMappings: CategoryDiscountMappingEntity[];

  @OneToMany(() => ProductEntity, (products) => products.category)
  products: ProductEntity[];
}
