import { Omit, Required } from './typeHelpers';
import { ILongTerm } from './staticStatisticsTypes/longTerm';
export interface IBasicStatisticsInputLocation {
    postcode: string;
}
export interface IBasicStatisticsLocation extends IBasicStatisticsInputLocation {
    districts: string;
    ceremonialCounty: string;
    regions: string;
}
export interface IBasicStatisticsInputPurchase {
    askingPrice: number;
    stampDutyType?: string;
    stampDuty?: number;
    stampDutyIsOverridden?: boolean;
    solicitorsFeePercent?: number;
    sourcingFeePercent?: number;
    otherFeesPercent?: number;
    otherPurchaseCosts?: number;
}
export interface IBasicStatisticsPurchase extends Required<IBasicStatisticsInputPurchase> {
    solicitorsFee: number;
    sourcingFee: number;
    otherFees: number;
    totalPurchaseCosts: number;
}
export interface IBasicStatisticsInputTimeline {
    projectDuration: number;
}
export interface IBasicStatisticsTimeline extends IBasicStatisticsInputTimeline {
}
export interface IBasicStatisticsInputUnit {
    type: string;
    quantity: number;
    averageMarketRent?: number;
    averageMarketPrice?: number;
    estimatedSize?: number;
    estimatedBuildCostPerSqFt?: number;
}
export interface IBasicStatisticsReportUnit extends Required<IBasicStatisticsInputUnit> {
    buildCost: number;
}
export interface IBasicStatisticsGrossDevelopmentValue {
    resiUnitsBMValuation: number;
    resiUnitsCommercialValuation: number;
    commUnitsCommercialValuation: number;
    totalBasedOnBMValuation: number;
    totalBasedOnCommercialValuation: number;
}
export interface IBasicStatisticsInputConstruction {
    typeOfProject: string;
    estimatedTypeOfConstructionCosts: string;
    otherDevelopmentFeesPercent?: number;
    totalDevelopmentCosts?: number;
    professionalFeesPercent?: number;
    otherDevelopmentCosts?: number;
    totalDevelopmentCostsIsOverridden?: boolean;
    planningCosts?: number;
    finalSize?: number;
    finalSizeIsOverridden?: boolean;
}
export interface IBasicStatisticsConstruction extends Required<IBasicStatisticsInputConstruction> {
    typeOfConstructionWorks: string;
    finalNumberOfUnits: number;
    buildingCostsForAllUnits: number;
    averageCostsPerUnit: number;
    averageCostsPerFt: number;
    professionalFees: number;
    otherDevelopmentFees: number;
}
export interface IBasicStatisticsInputFinancing {
    typeOfFinancing: string;
    timeForLending: number;
    ltvAmountForPurchasePercent?: number;
    loanCost?: number;
    lendingInterestRate?: number;
    entryFeePercent?: number;
    exitFeePercent?: number;
    brokerFeePercent?: number;
    otherFinancingCosts?: number;
    ltvAmountForConstructionPercent?: number;
    incomeFromProperty?: number;
}
export interface IBasicStatisticsFinancing extends Required<IBasicStatisticsInputFinancing> {
    loanAmountForPurchase: number;
    loanAmountForConstruction: number;
    incomeFromPropertyDuringProjectTime: number;
    loanAmountForPurchaseInclOtherPropertyIncome: number;
    totalFees: number;
    entryFee: number;
    exitFee: number;
    brokerFee: number;
    purchaseEquity: number;
    developmentEquity: number;
    totalMoneyNeeded: number;
    totalLoanToBeReceived: number;
    totalOwnCapitalNeeded: number;
}
export interface IBasicStatisticsInputCashFlowStrategy {
    rentalVoidsPercent?: number;
    rentalManagementCostsPercent?: number;
    rentalMOEPercent?: number;
    repaymentYearsBMValuation?: number;
    repaymentYearsCommValuation?: number;
}
export interface IBasicStatisticsInputLongTerm {
    appreciationRate?: number;
    incomeInflationRate?: number;
    expenseInflationRate?: number;
    otherSalesCosts?: number;
    vacancyRate?: number;
    propertySaleYear?: number;
    loanPaymentFrequency?: string;
    loanType?: string;
}
declare type ExcludedFields = 'repaymentYearsBMValuation' | 'repaymentYearsCommValuation';
export interface ICashFlowStrategy extends Required<Omit<IBasicStatisticsInputCashFlowStrategy, ExcludedFields>> {
    GDVResiUnits: number;
    GDVCommUnits: number;
    totalGDV: number;
    totalRentsWeeklyResiUnits: number;
    totalRentsMonthlyResiUnits: number;
    totalRentsPerYearResiUnits: number;
    totalRentsWeeklyCommUnits: number;
    totalRentsMonthlyCommUnits: number;
    totalRentsPerYearCommUnits: number;
    totalRentsMonthlyResiAndCommUnits: number;
    totalRentsPerYearResiAndCommUnits: number;
    averageRentPerUnitMonthlyResiUnits: number;
    averageRentPerSqFtResiUnits: number;
    voidsPerMonth: number;
    voidsPerYear: number;
    grossCashFlowPerYear: number;
    grossCashFlowPerMonth: number;
    managementCostsPerYear: number;
    managementCostsPerMonth: number;
    MOEPerYear: number;
    MOEPerMonth: number;
    cashFlowPerYearBeforeMortgage: number;
    cashFlowPerMonthBeforeMortgage: number;
    mortgagePaymentBMValuation: number;
    netCashFlowPerMonthBMValuation: number;
    netCashFLowPerYearBMValuation: number;
    mortgagePaymentCommValuation: number;
    netCashFlowPerMonthCommValuation: number;
    netCashFLowPerYearCommValuation: number;
}
interface IBasicStatisticsInputRefinancing {
    LTV?: number;
    interestRate?: number;
}
interface IRefinancing extends Required<IBasicStatisticsInputRefinancing> {
    repaymentYears: number;
    loanValue: number;
    moneyLeftInTheDeal: number;
}
export interface IRefinancingCommercial extends IRefinancing {
    initialMoneySpent: number;
}
export interface IRefinancingBM extends IRefinancing {
    initialMoneyInvested: number;
    multipleUsed: number;
}
export interface IBasicStatisticsInputDivestmentStrategy {
    legalFeesPercent?: number;
    otherSalesCostsPercent?: number;
    marketingCostsPercent?: number;
    showHomeStagingPercent?: number;
}
export interface IDivestmentStrategy extends Required<IBasicStatisticsInputDivestmentStrategy> {
    GDVResiUnits: number;
    GDVCommUnits: number;
    totalGDV: number;
    expectedPricePerUnit: number;
    totalSalesCosts: number;
    legalFees: number;
    marketingCosts: number;
    showHomeStaging: number;
    otherSalesCosts: number;
    netSalesFinalPrice: number;
    valueAdded: number;
    netProfit: number;
}
export interface IReturnMultiples {
    cashROIAfterRefinancingBMValuation: number;
    grossYieldBMValuation: number;
    capRateBMValuation: number;
    ROICBMValuation: number;
    annualisedROIC: number;
    ROIOnInitialInvestedEquity: number;
    annualisedROI: number;
    debtCoverageBMValuation: number;
    commercialToBMValuationMultiple: number;
    grossYieldCommValuation: number;
    capRateCommValuation: number;
    cashROIAfterRefinancingCommercial: number;
    debtCoverageCommValuation: number;
}
export interface IBasicStatisticsReport {
    specialistComment?: string;
    location: IBasicStatisticsLocation;
    purchase: IBasicStatisticsPurchase;
    timeline: IBasicStatisticsTimeline;
    units: IBasicStatisticsReportUnit[];
    grossDevelopmentValue: IBasicStatisticsGrossDevelopmentValue;
    construction: IBasicStatisticsConstruction;
    financing: IBasicStatisticsFinancing;
    cashFlowStrategy: ICashFlowStrategy;
    refinancing: {
        commercialValuation: IRefinancingCommercial;
        BMValuation: IRefinancingBM;
    };
    divestmentStrategy: IDivestmentStrategy;
    returnMultiples: IReturnMultiples;
    commercial?: IBasicStatisticsInputCommercial;
}
export interface IBasicStatisticsInputCommercial {
    commercialUnitsAmount?: number;
    totalRentsPerAnnumCommercial?: number;
    totalValueOfCommercialUnits?: number;
}
export interface IInputRefinancingBM extends IBasicStatisticsInputRefinancing {
    repaymentYears?: number;
    multipleUsed?: number;
}
export interface IInputRefinancingCommercial extends IBasicStatisticsInputRefinancing {
    repaymentYears?: number;
}
export interface IBasicStatisticsInputData {
    dealName?: string;
    description?: string;
    sourceLink?: string;
    location: IBasicStatisticsInputLocation;
    purchase: IBasicStatisticsInputPurchase;
    timeline: IBasicStatisticsInputTimeline;
    units: IBasicStatisticsInputUnit[];
    commercial?: IBasicStatisticsInputCommercial;
    construction: IBasicStatisticsInputConstruction;
    financing: IBasicStatisticsInputFinancing;
    refinancing?: {
        BMValuation?: IInputRefinancingBM;
        commercialValuation?: IInputRefinancingCommercial;
    };
    longTermOptions?: IBasicStatisticsInputLongTerm;
    cashFlowStrategy?: IBasicStatisticsInputCashFlowStrategy;
    divestmentStrategy?: IBasicStatisticsInputDivestmentStrategy;
}
export declare enum ECalculationTypes {
    Default = "default",
    User = "user",
    Specialist = "specialist",
    LongTerm = "longTerm",
    SalesHistory = "salesHistory",
    ConfirmedHints = "confirmedHints"
}
export declare enum EBasicStatisticsReportStatuses {
    New = "new",
    Pending = "pending",
    Success = "success"
}
export interface IBasicStatisticsReportDocumentCalculation {
    type: ECalculationTypes;
    data: IBasicStatisticsReport | ILongTerm | ISalesHistory[] | {
        url: string;
    };
}
export interface IBasicStatisticsReportDocument {
    _id: string;
    status: EBasicStatisticsReportStatuses;
    calculations: IBasicStatisticsReportDocumentCalculation[];
    configuration: IBasicStatisticsInputData;
    calculationsTypes: ECalculationTypes[];
    customData: any;
    createdAt: Date;
    calculatedAt: Date;
    issuerId: string;
}
export interface ISalesHistory {
    pricePaid: number;
    deedDate: Date;
    postcode: string;
    typeOfProperty: string;
    newBuild: boolean;
    estateType: string;
    saon: string;
    paon: string | number;
    street: string;
    locality: string;
    town: string;
    district: string;
    county: string;
    transactionCategory: string;
    linkedDataUri: string;
}
export declare type IEnumTpProp<IValueType> = {
    [key in ECalculationTypes]?: IValueType;
};
export interface IBasicStatisticsSpecialistReportCalculations extends IBasicStatisticsReport {
}
export interface IBasicStatisticsSpecialistDocumentCalculation extends IEnumTpProp<IBasicStatisticsSpecialistReportCalculations> {
}
export {};
