import { AptlyAddress } from './address.js';
import { AptlyCategorySchema } from './category.js';
import { AptlyDocumentSchema } from './document.js';
import { AptlyInviteSchema } from './invite.js';
import { AptlyOrderSchema } from './order.js';
import { AptlyPeriodSchema } from './period.js';
import { AptlyProducerSchema } from './producer.js';
import { AptlyProductSchema } from './product.js';
import { AptlyProjectSchema } from './project.js';
import { AptlyHistorySchema } from './extends.js';
import { AptlyUnitTemplateBaseSchema, AptlyUnitTemplateCategorySchema, AptlyUnitTemplateCategorySectionSchema, AptlyUnitTemplateSchema } from './unit-template';
import { AptlyIntegration, AptlyUnitItemParamKey, AptlyUnitStatus } from '../enums/index.js';
import { AptlyUserSchema } from './user.js';
import { AptlyOrganizationSchema } from './organization.js';
export type AptlyUnitContent = AptlyUnitContentSchema<string, string>;
export type AptlyUnitContentSchema<ID, DATE> = Pick<AptlyUnitSchema<ID, DATE>, '_id' | 'name' | 'address' | 'shipping' | 'billing'>;
export type AptlyUnit = AptlyUnitSchema<string, string>;
export interface AptlyUnitSchema<ID, DATE> extends AptlyUnitTemplateBaseSchema<ID, DATE>, AptlyUnitEditData<DATE>, AptlyHistorySchema<ID, DATE> {
    status: AptlyUnitStatus;
    vat?: string;
    addressHash?: string;
    shipping?: AptlyAddress;
    billing?: AptlyAddress;
    rooms: AptlyUnitRoomSchema<ID, DATE>[];
    selectedOptions: AptlyUnitSelectedOptionSchema<ID, DATE>[];
    items: AptlyUnitOptionItemSchema<ID, DATE>[];
    revertedOptions?: AptlyUnitOptionItemSchema<ID, DATE>[];
    revertedItems?: AptlyUnitOptionItemSchema<ID, DATE>[];
    extraOptions: AptlyUnitOptionExtraItemSchema<ID, DATE>[];
    categoryOverrides: AptlyUnitCategoryOverrideSchema<ID>[];
    productOverrides: AptlyUnitProductOverrideSchema<ID>[];
    ordersToSign: ID[];
    categoriesRead: ID[];
    spec: AptlyUnitSpec<ID>;
    buildStep: number;
    documents: (AptlyDocumentSchema<ID, DATE> | ID)[];
    unitPlans: {
        image: string;
        description?: string;
    }[];
    organization: AptlyOrganizationSchema<ID, DATE> | ID;
    project: AptlyProjectSchema<ID, DATE> | ID;
    users: (AptlyUserSchema<ID, DATE> | ID)[];
    unitTemplate?: ID | AptlyUnitTemplateSchema<ID, DATE> | null;
    unitTemplateEjected?: boolean;
    confirmedPeriods: AptlyUnitConfirmedPeriodSchema<ID, DATE>[];
    queueInvites: string[];
    invites: AptlyUnitInviteSchema<ID, DATE>[];
    invitesQueue: AptlyUnitInviteQueueSchema[];
    overridePeriod?: ID;
    overridePeriods?: AptlyUnitOverridePeriodSchema<ID, DATE>[];
    integrations: AptlyUnitIntegrationSchema<ID>[];
    gdpr?: AptlyUnitGDPRSchema<DATE, ID>;
    tree: any[];
    created: DATE;
}
interface AptlyUnitGDPRSchema<DATE, ID> {
    approved: boolean;
    approvedAt: DATE | null;
    documents: ID[];
    users: ID[];
}
export type AptlyUnitOverridePeriod = AptlyUnitOverridePeriodSchema<string, string>;
export interface AptlyUnitOverridePeriodSchema<ID, DATE> {
    _id: ID;
    period: ID;
    close: DATE;
}
export type AptlyUnitItemBase = AptlyUnitItemBaseSchema<string, string>;
export interface AptlyUnitItemBaseSchema<ID, DATE> {
    _id: ID;
    product: ID | AptlyProductSchema<ID, DATE>;
    variant: ID;
    producer: ID | AptlyProducerSchema<ID, DATE>;
    category?: ID | AptlyUnitTemplateCategorySchema<ID, DATE>;
    section?: ID | AptlyUnitTemplateCategorySectionSchema<ID, DATE>;
    period?: ID;
    quantity: number;
    standard?: boolean;
    pickDate: string;
    confirmDate?: DATE;
    pickedBy: ID;
    text?: string;
    params: AptlyUnitItemParamSchema<ID>[];
    baseCost?: number;
}
export type AptlyUnitOption = AptlyUnitSelectedOptionSchema<string, string>;
export interface AptlyUnitSelectedOptionSchema<ID, DATE> {
    _id: ID;
    category: ID | AptlyUnitTemplateCategorySchema<ID, DATE>;
    section: ID | AptlyUnitTemplateCategorySectionSchema<ID, DATE>;
    sectionProductRef: ID;
    product: ID | AptlyProductSchema<ID, DATE>;
    variant: ID;
    period: ID;
    quantity: number;
    pickDate: DATE;
    pickedBy: ID;
    confirmDate?: DATE;
    params: AptlyUnitItemParamSchema<ID>[];
    package?: ID;
    assortment?: ID;
    standard?: boolean;
    text?: string;
    producer?: ID | AptlyProducerSchema<ID, DATE>;
    baseCost?: number;
}
export type AptlyUnitOptionItem = AptlyUnitOptionItemSchema<string, string>;
export interface AptlyUnitOptionItemSchema<ID, DATE> extends AptlyUnitSelectedOptionSchema<ID, DATE> {
    unitCost: number;
    unitVat?: number;
    pickRef?: ID;
    order?: ID;
}
export type AptlyUnitOptionExtraItem = AptlyUnitOptionExtraItemSchema<string, string>;
export interface AptlyUnitOptionExtraItemSchema<ID, DATE> extends AptlyUnitOptionItemSchema<ID, DATE> {
    _id: ID;
    unitCost: number;
    addToNextOrder?: boolean;
    text?: string;
    customDescription?: string;
    algorithm?: ID;
    projectItemRef?: ID;
    revertedOption?: boolean;
    revertItemRef?: ID;
    unitTemplateCategory?: ID;
    document?: ID;
    prerequisites?: {
        totalCost?: number;
    };
    thirdPartyUploader?: string;
    cost: number;
    customTitle?: string;
}
export type AptlyUnitItemParam<VALUE> = AptlyUnitItemParamSchema<string, VALUE>;
export interface AptlyUnitItemParamSchema<ID, VALUE = any> {
    _id: ID;
    key: AptlyUnitItemParamKey;
    value: VALUE;
    downloadToken?: string;
}
export type AptlyUnitRoom = AptlyUnitRoomSchema<string, string>;
export interface AptlyUnitRoomSchema<ID, DATE> {
    _id: ID;
    category?: ID | AptlyCategorySchema<ID, DATE> | null;
    name: string;
    sizeParams: AptlyUnitRoomSchemaSizeParamSchema<ID>[];
}
export type AptlyUnitRoomSchemaSizeParam = AptlyUnitRoomSchemaSizeParamSchema<string>;
export interface AptlyUnitRoomSchemaSizeParamSchema<ID> {
    _id: ID;
    key: string;
    value: number;
}
export type AptlyUnitCategoryOverride = AptlyUnitCategoryOverrideSchema<string>;
export interface AptlyUnitCategoryOverrideSchema<ID> {
    category: ID;
    size: number;
    hide: boolean;
}
export type AptlyUnitProductOverride = AptlyUnitProductOverrideSchema<string>;
export interface AptlyUnitProductOverrideSchema<ID> {
    sectionProductRef: ID;
    section: ID;
    amount?: number;
    unitCost?: number;
    algorithm?: ID;
    variantPrices?: AptlyUnitProductOverrideVariantPriceSchema<ID>[];
    hide?: boolean;
}
export type AptlyUnitProductOverrideVariantPrice = AptlyUnitProductOverrideVariantPriceSchema<string>;
export interface AptlyUnitProductOverrideVariantPriceSchema<ID> {
    _id: ID;
    variant: ID;
    price: number;
}
export interface AptlyUnitSpec<ID> {
    categories: {
        _id: ID;
        name: string;
        isRoom: boolean;
        size: number;
        sections: {
            name: string;
            standard: boolean;
            displayType: 'default';
        }[];
    }[];
}
export type AptlyUnitConfirmedPeriod = AptlyUnitConfirmedPeriodSchema<string, string>;
export interface AptlyUnitConfirmedPeriodSchema<ID, DATE> {
    _id: ID;
    period: ID;
    confirmed?: DATE;
    order?: ID | AptlyOrderSchema<ID, DATE>;
}
export type AptlyUnitIntegration = AptlyUnitIntegrationSchema<string>;
export interface AptlyUnitIntegrationSchema<ID> {
    _id: ID;
    integration: AptlyIntegration;
    unit?: string;
    plantId?: string;
    tags?: string[];
}
interface AptlyUnitEditData<DATE> {
    address?: string;
    zipCode?: string;
    city?: string;
    houseNumber?: string;
    entrance?: string;
    floor?: string;
    oldAddress?: string;
    storageNumber?: string;
    garageNumber?: string;
    garagePortNumber?: string;
    garagePowerID?: string;
    electricCar?: string;
    unitNumber?: string;
    countyNumber?: string;
    holdingNumber?: number;
    subHoldingNumber?: number;
    leaseNumber?: number;
    sectionNumber?: number;
    boligmappaNumber?: string;
    tapWaterID?: string;
    tapWaterID2?: string;
    hotWaterID?: string;
    hotWaterID2?: string;
    remoteHeatID?: string;
    gasID?: string;
    powerCabinetID?: string;
    powerCabinetMeasureID?: string;
    unitKeys?: number;
    postboxKeys?: number;
    electricKeys?: number;
    balconyKeys?: number;
    handoverDate?: DATE | null;
}
export interface AptlyUnitInviteQueueSchema {
    email: string;
    fullName?: string;
    phone?: string;
}
export interface AptlyUnitInviteSchema<ID, DATE> extends AptlyInviteSchema<ID, DATE> {
    newOwner: boolean;
    allowAsGuest?: boolean;
}
export type AptlyUnitPeriod = AptlyUnitPeriodSchema<string, string>;
export type AptlyUnitPeriodSchema<ID, DATE> = AptlyPeriodSchema<ID, DATE> & Pick<AptlyUnitConfirmedPeriodSchema<ID, DATE>, 'confirmed' | 'order'>;
export {};
