import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  BeforeInsert,
  UpdateDateColumn,
  CreateDateColumn,
  DeleteDateColumn,
  OneToMany,
  ManyToMany,
  JoinTable,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import * as bcrypt from 'bcrypt';
import { AppUsersStep } from 'src/app_users_steps/entities/app_users_step.entity';
import { Group } from 'src/groups/entities/group.entity';
import { UserAchievement } from 'src/achievements/entities/user-achievement.entity';
import { Province } from 'src/provinces/entities/province.entity';
import { UserNotification } from 'src/notifications/entities/user-notification.entity';
import { UserStreak } from 'src/streaks/entities/user-streak.entity';

@Entity('app_users')
export class AppUser {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

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

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

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

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

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

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

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

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

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

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

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

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

  @Column({ type: 'boolean', default: false })
  is_email_verified: boolean;

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

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

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

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

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

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

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

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

  @Column({ type: 'uuid' })
  province_id: string;

  @Column({ type: 'boolean' })
  notify: boolean;

  @Column({ type: 'boolean', default: false })
  is_step_tracking_enabled: boolean;

  @UpdateDateColumn()
  updated_at: Date;

  @CreateDateColumn()
  created_at: Date;

  @DeleteDateColumn()
  deleted_at: Date;

  @OneToMany(() => AppUsersStep, (steps) => steps.app_user)
  user_steps: AppUsersStep[];

  @OneToMany(
    () => UserNotification,
    (user_notifications) => user_notifications.app_user,
  )
  user_notifications: UserNotification;

  @OneToMany(
    () => UserAchievement,
    (user_achievements) => user_achievements.user,
  )
  user_achievements: UserAchievement[];

  @OneToMany(() => Group, (group) => group.group_owner)
  group: Group[];

  @OneToMany(() => UserStreak, (user_streaks) => user_streaks.app_user)
  user_streaks: UserStreak[];

  @ManyToMany(() => Group)
  @JoinTable({
    name: 'user_groups',
    joinColumn: {
      name: 'app_user_id',
      referencedColumnName: 'id',
    },
    inverseJoinColumn: {
      name: 'group_id',
      referencedColumnName: 'id',
    },
  })
  user_groups: Group[];

  @ManyToOne(() => Province, (province) => province.app_users)
  @JoinColumn({ name: 'province_id' })
  province: Province;
}
