import {
  BaseEntity,
  Column,
  CreateDateColumn,
  Entity,
  ManyToOne,
  OneToMany,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';
import { Licensee } from '../licensee/licensee.entity';
import { Message } from '../message/message.entity';
import { ETicketStatus } from './enums/eticket-status.enum';

@Entity()
export class Ticket extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @ManyToOne(() => Licensee, (licensee) => licensee.id)
  licensee: Promise<Licensee>;

  @CreateDateColumn()
  createdOn: Date;

  @UpdateDateColumn()
  updatedOn: Date;

  @Column({ default: null })
  lastQueriedOn: Date;

  @OneToMany(() => Message, (message) => message.ticket)
  messages: Promise<Message[]>;

  @Column()
  slackThreadTs: string;

  @Column({ default: ETicketStatus.OPEN })
  status: ETicketStatus;

  static findBySlackThreadTs(slackThreadTs: string): Promise<Ticket> {
    return Ticket.findOne({ slackThreadTs });
  }

  async refreshLastQueriedOn() {
    this.lastQueriedOn = new Date();
    await this.save();
  }

  async hasUnread(): Promise<boolean> {
    const filteredMessages: Message[] = [];
    for (const m of await this.messages) {
      if (await m.slackSentBy) {
        filteredMessages.push(m);
      }
    }

    return (
      this.lastQueriedOn !== null &&
      filteredMessages
        .map((m) => m.createdOn.getTime())
        .sort((a, b) => b - a)[0] > this.lastQueriedOn.getTime()
    );
  }
}
