import { IsInt, IsNotEmpty, IsPositive } from "class-validator";
import { ChildEntity, Column, ManyToOne } from "typeorm";
import { Donation } from "./Donation";
import { Runner } from "./Runner";

/**
 * Defines the DistanceDonation entity.
 * For distanceDonations a donor pledges to donate a certain amount for each kilometer ran by a runner.
*/
@ChildEntity()
export class DistanceDonation extends Donation {
  /**
   * The donation's associated runner.
   * Used as the source of the donation's distance.
   */
  @IsNotEmpty()
  @ManyToOne(() => Runner, runner => runner.distanceDonations)
  runner: Runner;

  /**
   * The donation's amount donated per distance.
   * The amount the donor set to be donated per kilometer that the runner ran.
   */
  @Column()
  @IsInt()
  @IsPositive()
  amountPerDistance: number;

  /**
   * The donation's amount in cents (or whatever your currency's smallest unit is.).
   * Get's calculated from the runner's distance ran and the amount donated per kilometer.
   */
  public get amount(): number {
    let calculatedAmount = -1;
    try {
      calculatedAmount = this.amountPerDistance * (this.runner.distance / 1000);
    } catch (error) {
      throw error;
    }
    return calculatedAmount;
  }
}
