import Decimal from 'decimal.js-light'
import {
  BaseEntity,
  Column,
  Entity,
  PrimaryGeneratedColumn,
  DeleteDateColumn,
  JoinColumn,
  ManyToOne,
  OneToMany,
} from 'typeorm'
import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer'
import { User } from '../User'
import { ContributionMessage } from '../ContributionMessage'

@Entity('contributions')
export class Contribution extends BaseEntity {
  @PrimaryGeneratedColumn('increment', { unsigned: true })
  id: number

  @Column({ unsigned: true, nullable: false, name: 'user_id' })
  userId: number

  @ManyToOne(() => User, (user) => user.contributions)
  @JoinColumn({ name: 'user_id' })
  user: User

  @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP', name: 'created_at' })
  createdAt: Date

  @Column({ type: 'datetime', nullable: false, name: 'contribution_date' })
  contributionDate: Date

  @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' })
  memo: string

  @Column({
    type: 'decimal',
    precision: 40,
    scale: 20,
    nullable: false,
    transformer: DecimalTransformer,
  })
  amount: Decimal

  @Column({ unsigned: true, nullable: true, name: 'moderator_id' })
  moderatorId: number

  @Column({ unsigned: true, nullable: true, name: 'contribution_link_id' })
  contributionLinkId: number

  @Column({ unsigned: true, nullable: true, name: 'confirmed_by' })
  confirmedBy: number

  @Column({ nullable: true, name: 'confirmed_at' })
  confirmedAt: Date

  @Column({ unsigned: true, nullable: true, name: 'denied_by' })
  deniedBy: number

  @Column({ nullable: true, name: 'denied_at' })
  deniedAt: Date

  @Column({
    name: 'contribution_type',
    length: 12,
    nullable: false,
    collation: 'utf8mb4_unicode_ci',
  })
  contributionType: string

  @Column({
    name: 'contribution_status',
    length: 12,
    nullable: false,
    collation: 'utf8mb4_unicode_ci',
  })
  contributionStatus: string

  @Column({ unsigned: true, nullable: true, name: 'transaction_id' })
  transactionId: number

  @DeleteDateColumn({ name: 'deleted_at' })
  deletedAt: Date | null

  @OneToMany(() => ContributionMessage, (message) => message.contribution)
  @JoinColumn({ name: 'contribution_id' })
  messages?: ContributionMessage[]
}
