import { IsInt, IsNotEmpty, IsPositive } from "class-validator";
import { Donation } from '../entities/Donation';
import { DonationStatus } from '../enums/DonationStatus';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import type { ResponseDonor } from './ResponseDonor';

/**
 * Defines the donation response.
*/
export class ResponseDonation implements IResponse {

    /**
    * The responseType.
    * This contains the type of class/entity this response contains.
    */
    responseType: ResponseObjectType = ResponseObjectType.DONATION;

    /**
    * The donation's payment status.
    * Provides you with a quick indicator of it's payment status.
    */
    status: DonationStatus;

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

    /**
     * The donation's donor.
     */
    @IsNotEmpty()
    donor?: ResponseDonor;

    /**
     * The donation's amount in the smalles unit of your currency (default: euro cent).
     */
    @IsInt()
    amount: number;

    /**
     * The donation's paid amount in the smalles unit of your currency (default: euro cent).
     */
    @IsInt()
    paidAmount: number;

    @IsInt()
    @IsPositive()
    created_at: number;

    @IsInt()
    @IsPositive()
    updated_at: number;

    /**
     * Creates a ResponseDonation object from a scan.
     * @param donation The donation the response shall be build for.
     */
    public constructor(donation: Donation) {
        this.id = donation.id;
        if (donation.donor) {
            this.donor = donation.donor.toResponse();
        }
        this.amount = donation.amount;
        this.paidAmount = donation.paidAmount || 0;
        if (this.paidAmount < this.amount) {
            this.status = DonationStatus.OPEN;
        }
        else {
            this.status = DonationStatus.PAID;
        }
        this.created_at = donation.created_at;
        this.updated_at = donation.updated_at;
    }
}
