import { UserEntity } from 'src/modules/user/entities/user.entity';
import { VirtualColumn } from 'src/utils/decorators/virtual-column.decorator';
import { BooleanTransformer } from 'src/utils/transformers/BooleanTransformer';
import { NumberTransformer } from 'src/utils/transformers/NumberTransformer';
import {
  Column,
  Entity,
  BaseEntity,
  JoinColumn,
  ManyToOne,
  OneToMany,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { NewscommentEntity } from './news-comment.entity';

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

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

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

  @Column('char', { name: 'userId', nullable: true, length: 36 })
  userId: string | null;

  @Column('varchar', { name: 'title', nullable: true, length: 200 })
  title: 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('int', { name: 'displayOrder', nullable: true })
  displayOrder: number | null;

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

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

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

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

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

  /**
   * Virtual columns
   */
  @VirtualColumn('commentCount', {
    transformer: new NumberTransformer(),
  })
  commentCount: number;

  /**
   * Relations
   */
  @ManyToOne(() => UserEntity, (users) => users.news, {
    onDelete: 'NO ACTION',
    onUpdate: 'NO ACTION',
  })
  @JoinColumn([{ name: 'userId', referencedColumnName: 'id' }])
  user: UserEntity;

  @OneToMany(() => NewscommentEntity, (newscomments) => newscomments.news)
  newscomments: NewscommentEntity[];
}
