
export interface FileAttachment {
    fileName: string;
    fileSize: number;
    fileType: string;
    fileLastModified: number;
    fileContentsBase64: string;
    uploadedAt: Date;
};

export interface YearMonth {
    year: number;
    month: number;
};

/** User settings data */
export interface UserSettings {
    /** user's ID */
    userId: string;
    /** whether enableshow IBAN payment instructions in monthly statement */
    enableIbanPayment?: boolean | null;
    /** owner name */
    ownerName?: string | null;
    /** owner street */
    ownerStreet?: string | null;
    /** owner town */
    ownerTown?: string | null;
    /** owner IBAN */
    ownerIBAN?: string | null;
    /** currency (ISO 4217) */
    currency?: string | null;
    /** whether to enable Revolut payment instructions in monthly statement */
    enableRevolutPayment?: boolean | null;
    /** owner Revolut payment link */
    ownerRevolutProfileName?: string | null;
};

/** bill object in the form returned by MongoDB */
export interface BillingLocation {
    _id: string;
    /** user's ID */
    userId: string;
    /** user's email */
    userEmail?: string | null;
    /** name of the location */
    name: string;
    /** billing period year and month */
    yearMonth: YearMonth;
    /** array of bills */
    bills: Bill[];
    /** (optional) notes */
    notes: string|null;

    /** (optional) method for showing payment instructions to tenant */
    tenantPaymentMethod?: "none" | "iban" | "revolut" | null;

    /** (optional) type of proof of payment attachment */
    proofOfPaymentType: "none" | "combined" | "per-bill";

    /** (optional) tenant name */
    tenantName?: string | null;
    /** (optional) tenant street */
    tenantStreet?: string | null;
    /** (optional) tenant town */
    tenantTown?: string | null;
    /** (optional) whether to automatically notify tenant */
    autoBillFwd?: boolean | null;
    /** (optional) tenant email */
    tenantEmail?: string | null;
    /** (optional) bill forwarding strategy */
    billFwdStrategy?: "when-payed" | "when-attached" | null;
    /** (optional) whether to automatically send rent notification */
    rentDueNotification?: boolean | null;
    /** (optional) day of month when rent is due (1-31) */
    rentDueDay?: number | null;
    /** (optional) monthly rent amount in cents */
    rentAmount?: number | null;
    /** (optional) whether the location has been seen by tenant */
    seenByTenantAt?: Date | null;
    /** (optional) utility bills proof of payment attachment */
    utilBillsProofOfPayment?: FileAttachment|null;
    /** (optional) rent proof of payment attachment */
    rentProofOfPayment?: FileAttachment|null;
    /** (optional) share link expiry timestamp */
    shareTTL?: Date;
    /** (optional) when tenant first visited the share link */
    shareFirstVisitedAt?: Date | null;
};

export enum BilledTo {
    Tenant = "tenant",
    Landlord = "landlord"
}

/** Bill basic data */
export interface Bill {
    _id: string;
    /** bill name */
    name: string;
    /** is the bill paid */
    paid: boolean;
    /** who is billed for the bill */
    billedTo?: BilledTo;
    /** payed amount amount in cents */
    payedAmount?: number | null;
    /** attached document (optional) */
    attachment?: FileAttachment|null;
    /**
     * true if there an attachment
     * @description this field enables us to send this info to the client without sending large attachment - it's an optimization
    */
    hasAttachment?: boolean;
    /** (optional) notes */
    notes?: string|null;
    /** 
     * (optional) image data containing PDF471 bar code
     * @deprecated LEGACY FIELD - use hub3aText instead
     * */
    barcodeImage?:string;
    /** (optional) HUB-3A text for generating PDF417 bar code */
    hub3aText?:string;
    /** (optional) proof of payment attachment */
    proofOfPayment?: FileAttachment|null;
};