import { IsInt, IsNotEmpty, IsOptional, IsPositive, IsString } from 'class-validator';
import { TrackLapTimeCantBeNegativeError } from '../../../errors/TrackErrors';
import { Track } from '../../entities/Track';

/**
 * This classed is used to create a new Track entity from a json body (post request).
 */
export class CreateTrack {
    /**
     * The new track's name.
     */
    @IsString()
    @IsNotEmpty()
    name: string;

    /**
     * The new track's distance in meters (must be greater than 0).
     */
    @IsInt()
    @IsPositive()
    distance: number;

    /**
     * The minimum time a runner should take to run a lap on this track (in seconds).
     * Will be used for fraud detection.
     */
    @IsInt()
    @IsOptional()
    minimumLapTime: number;

    /**
     * Creates a new Track entity from this.
     */
    public toEntity(): Track {
        let newTrack: Track = new Track();

        newTrack.name = this.name;
        newTrack.distance = this.distance;
        newTrack.minimumLapTime = this.minimumLapTime;
        if (this.minimumLapTime < 0) {
            throw new TrackLapTimeCantBeNegativeError();
        }

        return newTrack;
    }
}