import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  BeforeInsert,
  UpdateDateColumn,
  CreateDateColumn,
  DeleteDateColumn,
  OneToOne,
  JoinColumn,
  OneToMany,
  ManyToOne,
} from 'typeorm';
import * as bcrypt from 'bcrypt';
import { JobEntity } from 'src/job/entities/job.entity';
import { CityEntity } from 'src/cities/entities/city.entity';
import { PostEntity } from 'src/posts/entities/post.entity';

@Entity('users')
export class UserEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ type: 'varchar' })
  first_name: string;

  @Column({ type: 'varchar' })
  middle_name: string;

  @Column({ type: 'varchar' })
  last_name: string;

  @Column({ type: 'varchar' })
  password: string;

  @Column({ type: 'varchar' })
  email: string;

  @Column({ type: 'varchar' })
  city_id: string;

  @Column({ type: 'varchar' })
  job_id: string;

  @Column({ type: 'numeric' })
  contact_no: number;

  @Column({ type: 'varchar' })
  batch: number;

  @Column({ type: 'date', nullable: true })
  date_of_birth: Date;

  @Column({ type: 'varchar', nullable: true })
  designation: string;

  @Column({ type: 'varchar', nullable: true })
  company_name: string;

  @Column({ type: 'varchar', nullable: true })
  company_address: string;

  @Column({ type: 'varchar', nullable: true })
  home_town: string;

  @Column({ type: 'smallint', default: 1 })
  is_admin: number;

  @Column({ type: 'varchar' })
  profile_picture: string;

  @UpdateDateColumn()
  updated_at: Date;

  @Column({ type: 'smallint', default: 1 })
  status: number;

  @Column({ type: 'varchar', nullable: true })
  access_token: string;

  @Column({ type: 'varchar', nullable: true })
  access_token_expiry: string;

  @Column({ type: 'varchar', nullable: true })
  password_reset_token: string;

  @Column({ type: 'varchar', nullable: true })
  password_reset_token_expiry: string;

  @Column({ type: 'varchar', nullable: true })
  fcm_token: string;

  @Column({ type: 'varchar', nullable: true, array: true })
  course: string[];

  @CreateDateColumn()
  created_at: Date;

  @DeleteDateColumn()
  deleted_at: Date;

  @BeforeInsert()
  async hashPassword() {
    this.password = await bcrypt.hash(this.password, 10);
  }

  @ManyToOne(() => JobEntity, (job) => job.users)
  @JoinColumn({ name: 'job_id' })
  job: JobEntity;

  @ManyToOne(() => CityEntity, (city) => city.users)
  @JoinColumn({ name: 'city_id' })
  city: CityEntity;

  @OneToMany(() => PostEntity, (post) => post.user)
  posts: PostEntity[];
}
