import { Populated } from '../core/mongoose.js';
import { AptlyAddress, AptlySearchAddress } from './address.js';
import { AptlyAllowance, AptlyAllowanceChargeSchema, AptlyExtensionAmount, AptlyLegalMonetaryTotal } from './algorithm.js';
import { AptlyCompany, AptlyCompanySchema } from './company.js';
import { AptlyCustomerData, AptlyCustomerDataSchema } from './customer.js';
import { AptlyDocumentSchema } from './document.js';
import { AptlyBaseSchema } from './extends.js';
import { AptlyOptionPopulatedSchema, AptlyOptionSchema } from './option.js';
import { AptlyOrderPaymentStatus, AptlyOrderSchema } from './order.js';
import { AptlyOrganization, AptlyOrganizationSchema } from './organization.js';
import { AptlyPickSchema } from './pick.js';
import { AptlyProjectSchema } from './project.js';
import { AptlyUnitSchema } from './unit.js';
import { AptlyUserSchema } from './user.js';
import { AptlyCategorySchema } from './category';
import { AptlyApp, AptlyAppSchema } from './app';
export type AptlyOffer = AptlyOfferSchema<string, string>;
export interface AptlyOfferSchema<ID, DATE> extends AptlyBaseSchema<ID, DATE>, Omit<AptlyExtensionAmount, 'currency'> {
    organization: ID | AptlyOrganizationSchema<ID, DATE> | null;
    project: ID | AptlyProjectSchema<ID, DATE> | null;
    unit: ID | AptlyUnitSchema<ID, DATE> | null;
    order: ID | AptlyOrderSchema<ID, DATE> | null;
    company: ID | AptlyCompanySchema<ID, DATE> | null;
    document: ID | AptlyDocumentSchema<ID, DATE> | null;
    categories: (ID | AptlyCategorySchema<ID, DATE>)[];
    invoice: boolean;
    apps: (ID | AptlyAppSchema<ID, DATE>)[];
    createdBy: Populated<AptlyUserSchema<ID, DATE>> | null;
    expiresAt: DATE | null;
    sentAt: DATE | null;
    number: number | null;
    description: string;
    identification: string;
    incVAT: boolean;
    hidePrices: boolean;
    amount: number | null;
    allowance?: AptlyAllowance | null;
    algorithm: ID | null;
    items: AptlyOfferItemSchema<ID, DATE>[];
    customer: AptlyCustomerDataSchema<ID, DATE> | null;
    shipping: AptlyAddress | null;
    ourContact: Populated<AptlyUserSchema<ID, DATE>> | null;
    openedAt: DATE | null;
    acceptedAt: DATE | null;
    acceptedBy: ID | AptlyUserSchema<ID, DATE> | null;
    locked: boolean;
}
export type AptlyOfferItem = AptlyOfferItemSchema<string, string>;
export interface AptlyOfferItemSchema<ID, DATE> {
    _id: ID;
    option: ID | AptlyOptionSchema<ID, DATE>;
    quantity: number;
    amount: number;
    title?: string;
    algorithm: ID | null;
    note: string;
    createdAt?: DATE;
    index: number;
    allowance?: AptlyAllowance | null;
}
export type AptlyUserOffer = AptlyUserOfferSchema<string, string>;
export interface AptlyUserOfferSchema<ID, DATE> extends Omit<AptlyOfferSchema<ID, DATE>, 'amount' | 'items' | 'apps'> {
    apps: Pick<AptlyAppSchema<ID, DATE>, '_id' | 'name' | 'implements'>[];
    options: AptlyOptionPopulatedSchema<ID, DATE>[];
    picks?: AptlyPickSchema<ID, DATE>[];
}
export interface AptlyOfferSendInvoiceBody {
    invoice?: boolean;
    apps?: (string | AptlyApp)[];
    __hr?: undefined;
}
export interface AptlyOfferSendLinkBody {
    email: string;
}
export interface AptlyOfferSendUnitBody extends AptlyOfferSendInvoiceBody {
    unit: string;
    address: AptlySearchAddress | null;
    email?: string;
    firstName?: string;
    lastName?: string;
    phone?: string;
}
export interface AptlyOfferSendPrivateBody extends AptlyOfferSendInvoiceBody, Omit<AptlyCustomerData, 'fullName' | 'user'> {
    unit: string | null;
    address: AptlySearchAddress | null;
}
export interface AptlyOfferSendCustomerBody extends AptlyOfferSendInvoiceBody, Omit<AptlyCustomerData, 'companyVat' | 'companyName' | 'user'> {
    customer: string | null;
    address: AptlySearchAddress | null;
    shipping?: AptlyAddress | null;
}
export interface AptlyOfferSendCompanyBody extends AptlyOfferSendInvoiceBody, Omit<AptlyCustomerData, 'fullName' | 'user'> {
    company: Pick<AptlyCompany, 'name' | 'vat' | 'email' | 'phone' | 'shipping' | 'billing'> & Pick<AptlyOrganization, 'address'>;
    address: AptlyAddress;
}
export interface AptlyOfferQRBody {
    src: string;
    href: string;
}
export type AptlyPublicOfferCheckout = AptlyPublicOfferCheckoutSchema<string, string>;
export interface AptlyPublicOfferCheckoutSchema<ID, DATE> extends Pick<AptlyExtensionAmount, 'currency'> {
    status: AptlyOrderPaymentStatus;
    offer: Omit<AptlyUserOfferSchema<ID, DATE>, 'options'>;
    options: AptlyOptionPopulatedSchema<ID, DATE>[];
    organization: Pick<AptlyOrganizationSchema<ID, DATE>, 'name' | 'logoMedia'>;
    project: Pick<AptlyProjectSchema<ID, DATE>, 'name' | 'paymentApp' | 'signApp'> | null;
    unit: Pick<AptlyUnitSchema<ID, DATE>, '_id' | 'name'> | null;
    order?: Pick<AptlyOrderSchema<ID, DATE>, '_id' | 'status' | 'paymentSession' | 'billing' | 'shippingDate'>;
    app: Pick<AptlyAppSchema<ID, DATE>, '_id' | 'name' | 'implements'> | null;
    actions: {
        payment?: {
            active: boolean;
        };
        sign?: {
            active: boolean;
        };
        confirm?: {
            active: boolean;
        };
    };
    extensionAmount: number;
    extensionVatAmount: number;
    total: AptlyLegalMonetaryTotal;
    allowanceCharges: AptlyAllowanceChargeSchema<ID, boolean>[];
    terms?: AptlyDocumentSchema<ID, DATE> | null;
}
export interface AptlyPublicOfferAcceptBody {
    customer: AptlyCustomerData;
    shipping: AptlyAddress;
    billing: AptlyAddress | null;
    redirectUri: string;
}
