import { AppUser } from 'src/app_users/entities/app_user.entity';
import { News } from 'src/news/entities/news.entity';
import { Province } from 'src/provinces/entities/province.entity';
import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
  CreateDateColumn,
  DeleteDateColumn,
  ManyToMany,
  JoinTable,
  JoinColumn,
  ManyToOne,
} from 'typeorm';

@Entity('groups')
export class Group {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

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

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

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

  @Column({ type: 'timestamp' })
  goal_start_date: Date;

  @Column({ type: 'timestamp' })
  goal_end_date: Date;

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

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

  @Column({ type: 'boolean', default: true })
  is_shareable: boolean;

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

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

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

  @CreateDateColumn()
  created_at: Date;

  @UpdateDateColumn()
  updated_at: Date;

  @DeleteDateColumn()
  deleted_at: Date;

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

  @ManyToOne(() => AppUser, (group_owner) => group_owner.group)
  @JoinColumn({ name: 'owner_id' })
  group_owner: AppUser;

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

  @ManyToMany(() => News, { cascade: true })
  @JoinTable({
    name: 'groups_news',
    joinColumn: {
      name: 'group_id',
      referencedColumnName: 'id',
    },
    inverseJoinColumn: {
      name: 'news_id',
      referencedColumnName: 'id',
    },
  })
  news: News[];
}
