import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  ManyToOne,
  JoinColumn,
  CreateDateColumn,
  UpdateDateColumn,
  Unique,
} from "typeorm"
import { TeamMember } from "src/modules/team-member/entities/team_member.entity"
import { Customer } from "src/modules/customers/entities/customer.entity"
import { Trip } from "src/modules/trips/entities/trip.entity"
import { RatingType } from "../constants/rating-type.constants"

@Entity("ratings")
@Unique(["rater_id", "rated_id", "trip_id"])
export class Rating {
  @PrimaryGeneratedColumn()
  id: number

  @Column({ type: "int" })
  rater_id: number

  @Column({ type: "int" })
  rated_id: number

  @Column({ type: "int" })
  trip_id: number

  @Column({ type: "int", unsigned: true })
  rating: number // 1-5 stars

  @Column({ type: "text", nullable: true })
  other_input: string

  @Column({ type: "varchar", length: 50 })
  rating_type: RatingType

  @Column({ type: "json", nullable: true })
  tags: string[] // e.g. ["polite", "friendly"]

  @Column({ type: "boolean", default: false })
  no_rating: boolean // Flag to indicate user opted out of rating

  @Column({ type: "timestamp", nullable: true })
  no_rating_at: Date // Timestamp when user opted out

  @CreateDateColumn({ type: "timestamp", default: () => "CURRENT_TIMESTAMP" })
  created_at: Date

  @UpdateDateColumn({
    type: "timestamp",
    default: () => "CURRENT_TIMESTAMP",
    onUpdate: "CURRENT_TIMESTAMP",
  })
  updated_at: Date

  @ManyToOne(() => TeamMember, (teamMember) => teamMember.givenRatings, {
    createForeignKeyConstraints: false,
  })
  @JoinColumn({ name: "rater_id" })
  rater_driver: TeamMember

  @ManyToOne(() => Customer, (customer) => customer.givenRatings, {
    createForeignKeyConstraints: false,
  })
  @JoinColumn({ name: "rater_id" })
  rater_customer: Customer

  @ManyToOne(() => TeamMember, (teamMember) => teamMember.receivedRatings, {
    createForeignKeyConstraints: false,
  })
  @JoinColumn({ name: "rated_id" })
  rated_driver: TeamMember

  @ManyToOne(() => Customer, (customer) => customer.receivedRatings, {
    createForeignKeyConstraints: false,
  })
  @JoinColumn({ name: "rated_id" })
  rated_customer: Customer

  @ManyToOne(() => Trip, (trip) => trip.ratings)
  @JoinColumn({ name: "trip_id" })
  trip: Trip
}
