import { IsInt, IsOptional, IsPositive } from 'class-validator';
import { getConnection } from 'typeorm';
import { DonorNotFoundError } from '../../../errors/DonorErrors';
import { Donation } from '../../entities/Donation';
import { Donor } from '../../entities/Donor';

/**
 * This class is used to update a Donation entity (via put request).
 */
export abstract class UpdateDonation {
    /**
     * The updated donation's id.
     * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to).
     */
    @IsInt()
    id: number;

    /**
     * The updated donation's associated donor's id.
     * This is important to link donations to donors.
     */
    @IsInt()
    @IsPositive()
    donor: number;

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

    /**
     * Creates a new Donation entity from this.
     */
    public abstract update(donation: Donation): Promise<Donation>;

    /**
     * Gets a donor based on the donor id provided via this.donor.
     */
    public async getDonor(): Promise<Donor> {
        const donor = await getConnection().getRepository(Donor).findOne({ id: this.donor });
        if (!donor) {
            throw new DonorNotFoundError();
        }
        return donor;
    }
}