import {
    IsInt,
    IsObject,
    IsOptional,
    IsString
} from "class-validator";
import { Runner } from '../entities/Runner';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseRunnerGroup } from './ResponseRunnerGroup';

/**
 * Defines the runner stats response.
 * This differs from the normal runner responce.
*/
export class ResponseStatsRunner implements IResponse {
    /**
    * The responseType.
    * This contains the type of class/entity this response contains.
    */
    responseType: ResponseObjectType = ResponseObjectType.STATSRUNNER;

    /**
     * The runner's id.
     */
    @IsInt()
    id: number;

    /**
     * The runner's first name.
     */
    @IsString()
    firstname: string;

    /**
     * The runner's middle name.
     */
    @IsString()
    middlename?: string;

    /**
     * The runner's last name.
     */
    @IsString()
    lastname: string;

    /**
     * The runner's currently ran distance in meters.
     */
    @IsInt()
    distance: number;

    /**
     * The runner's currently collected donations.
     */
    @IsInt()
    donationAmount: number;

    /**
     * The runner's fastest laptime in seconds.
     */
    @IsInt()
    @IsOptional()
    minLaptime?: number;

    /**
     * The runner's group.
     */
    @IsObject()
    group: ResponseRunnerGroup;

    /**
     * Creates a new runner stats response from a runner
     * @param runner The runner whoes response shall be generated - the following relations have to be resolved: scans, group, distanceDonations, scans.track
     */
    public constructor(runner: Runner, laptime?: number) {
        this.id = runner.id;
        this.firstname = runner.firstname;
        if (runner.firstname) {
            this.middlename = runner.middlename;
        }
        this.lastname = runner.lastname;
        try {
            this.distance = runner.distance;
        }
        catch {
            this.distance = -1;
        }
        try {
            this.donationAmount = runner.distanceDonationAmount;
        }
        catch {
            this.donationAmount = -1;
        }
        if (laptime) {
            this.minLaptime = laptime;
        }
        this.group = runner.group.toResponse();
    }
}
