import { ValueOf } from '../../types';
import { InventoryLevelModelFragment, LocationModelFragment, OrderModelFragment, ProductModelFragment, ProductVariantModelFragment } from '../../types/ShopifyGraphQLAdminAPI';
import { Customer, CustomerKey, CustomerTypeName } from './Customer';
import { InventoryLevel, InventoryLevelKey, InventoryLevelTypeName } from './InventoryLevel';
import { LineItem, LineItemKey, LineItemTypeName } from './LineItem';
import { Location, LocationKey, LocationTypeName } from './Location';
import { Order, OrderPropsKey, OrderTypeName } from './Order';
import { Product, ProductKey, ProductTypeName } from './Product';
import { ProductVariant, ProductVariantKey, ProductVariantTypeName } from './ProductVariant';
export * from './ShopifyObject';
export * from './Product';
export * from './Order';
export * from './ProductVariant';
export * from './Location';
export * from './InventoryLevel';
export * from './LineItem';
export * from './Customer';
export * from './shopifyObjectFamilies';
export * from './shopifyModelUtil';
export declare type ShopifyObjects = {
    [OrderTypeName]: Order;
    [ProductTypeName]: Product;
    [ProductVariantTypeName]: ProductVariant;
    [LocationTypeName]: Location;
    [InventoryLevelTypeName]: InventoryLevel;
    [LineItemTypeName]: LineItem;
    [CustomerTypeName]: Customer;
};
declare const RESTBasedShopifyModelTypes: readonly ["line_items", "customers"];
declare type RESTBasedShopifyModelType = typeof RESTBasedShopifyModelTypes[number];
/**
 * We draw a distinction between the Shopify Object model and the raw result we retrieve from the GraphQL API.
 * The GraphQL API response should be saved *as is* onto ShopifyEntity.shopify_object. The Shopify object
 * can always be derived from the raw query result.
 *
 * We're going to start deviating from the above as we start bringing REST models in
 */
export declare type ShopifyObjectQueryResults = {
    [ProductTypeName]: ProductModelFragment;
    [ProductVariantTypeName]: ProductVariantModelFragment;
    [OrderTypeName]: OrderModelFragment;
    [LocationTypeName]: LocationModelFragment;
    [InventoryLevelTypeName]: InventoryLevelModelFragment;
    [LineItemTypeName]: LineItem['props'];
    [CustomerTypeName]: Customer['props'];
};
export declare type ShopifyObjectQueryResult = ValueOf<ShopifyObjectQueryResults>;
export declare type ShopifyObjectGQLQueryResult = ValueOf<Omit<ShopifyObjectQueryResults, RESTBasedShopifyModelType>>;
export declare type ShopifyObjectGQLQueryResults = Omit<ShopifyObjectQueryResults, RESTBasedShopifyModelType>;
export declare const GQLShopifyObjectTypes: readonly ["products", "product_variants", "orders", "locations", "inventory_levels"];
export declare const RESTShopifyObjectTypes: readonly ["line_items", "customers"];
export declare const ShopifyObjectTypes: readonly ["products", "product_variants", "orders", "locations", "inventory_levels", "line_items", "customers"];
export declare type ShopifyObjectType = typeof ShopifyObjectTypes[number];
export declare type GQLShopifyObjectType = typeof GQLShopifyObjectTypes[number];
export declare type RESTShopifyObjectType = typeof RESTShopifyObjectTypes[number];
export declare type ShopifyObject = Product | ProductVariant | Order | Location | InventoryLevel | LineItem | Customer;
/**
 * Currently the same as GQL but may differ in the future
 * e.g.
 * 1. dedicated customer job is something we probably want to do
 * 2. we might want to put in product variants inside the products job (probably not but a possibility)
 *
 */
export declare const TopLevelBulkJobShopifyObjectTypes: readonly ["products", "product_variants", "orders", "locations", "inventory_levels"];
/**
 * Types that have their own dedicated Shopify Bulk Job
 * Customers and LineItems do not atm
 * Customers probably should in the future
 */
export declare type TopLevelBulkJobShopifyObjectType = Exclude<ShopifyObjectType, RESTBasedShopifyModelType>;
/**
 * The order used when syncing entities from Shopify and checking for the existence of tables.
 */
export declare const ModelSyncOrder: Readonly<ShopifyObjectType[]>;
export declare const AirtableSyncOrder: Readonly<ShopifyObjectType[]>;
export declare function getSyncedObjectTypesInSyncOrder(syncedObjectTypes: ShopifyObjectType[]): ShopifyObjectType[];
export declare const ShopifyObjectDescriptions: Record<ShopifyObjectType, string>;
declare const RelationTypes: readonly ["HasMany", "BelongsTo", "HasOne"];
declare type RelationType = typeof RelationTypes[number];
declare type RelatedPropertyMap = {
    [T in ShopifyObjectType]: {
        [RelatedObjectType in ShopifyObjectType]?: {
            relation: RelationType;
            /**
             * The key of the Shopify object that will be used to create an Airtable record link.
             */
            key?: keyof ShopifyObjects[T]['props'];
        };
    };
};
export declare const ShopifyObjectRelations: RelatedPropertyMap;
export declare const ModelPropsKeys: {
    readonly orders: readonly [...import("./Order").PickableOrderPropsKey[], "cartDiscountAmount", "currentCartDiscountAmount", "currentSubtotalPrice", "currentTotalDiscounts", "currentTotalDuties", "currentTotalPrice", "currentTotalTax", "netPayment", "originalTotalDuties", "originalTotalPrice", "refundDiscrepancy", "subtotalPrice", "totalCapturable", "totalDiscounts", "totalOutstanding", "totalPrice", "totalReceived", "totalRefunded", "totalRefundedShipping", "totalShippingPrice", "totalTax", "totalTipReceived", "lineItems_json", "currentTaxLines_json", "customAttributes_json", "customer_json", "customerJourneySummary_json", "disputes_json", "fulfillments_json", "paymentCollectionDetails_json", "risks_json", "shippingLine_json", "taxLines_json", "transactions_json", "physicalLocationId", "publicationId", "billingAddressId", "billingAddressPhone", "billingAddressFirstName", "billingAddressLastName", "billingAddressAddress1", "billingAddressAddress2", "billingAddressCity", "billingAddressCompany", "billingAddressCountry", "billingAddressCountryCodeV2", "billingAddressLatitude", "billingAddressLongitude", "billingAddressProvince", "billingAddressProvinceCode", "billingAddressZip", "displayAddressId", "displayAddressPhone", "displayAddressFirstName", "displayAddressLastName", "displayAddressAddress1", "displayAddressAddress2", "displayAddressCity", "displayAddressCompany", "displayAddressCountry", "displayAddressCountryCodeV2", "displayAddressLatitude", "displayAddressLongitude", "displayAddressProvince", "displayAddressProvinceCode", "displayAddressZip", "shippingAddressId", "shippingAddressPhone", "shippingAddressFirstName", "shippingAddressLastName", "shippingAddressAddress1", "shippingAddressAddress2", "shippingAddressCity", "shippingAddressCompany", "shippingAddressCountry", "shippingAddressCountryCodeV2", "shippingAddressLatitude", "shippingAddressLongitude", "shippingAddressProvince", "shippingAddressProvinceCode", "shippingAddressZip"];
    readonly products: readonly [...("tags" | "id" | "title" | "vendor" | "createdAt" | "updatedAt" | "handle" | "legacyResourceId" | "description" | "descriptionHtml" | "isGiftCard" | "onlineStoreUrl" | "productType" | "publishedAt" | "requiresSellingPlan" | "status" | "storefrontId" | "featuredImage")[], "seo.description", "seo.title", "options.1", "options.2", "options.3"];
    readonly product_variants: readonly [...("id" | "price" | "sku" | "title" | "taxable" | "createdAt" | "updatedAt" | "product" | "legacyResourceId" | "requiresShipping" | "displayName" | "image" | "storefrontId" | "availableForSale" | "barcode" | "compareAtPrice" | "inventoryPolicy" | "inventoryQuantity" | "position" | "taxCode" | "weight" | "weightUnit" | "deliveryProfile" | "fulfillmentServiceEditable")[], "selectedOptions.1", "selectedOptions.2", "selectedOptions.3", "fulfillmentService.id", "product.id", "inventoryItem.id", "inventoryItem.createdAt", "inventoryItem.updatedAt", "inventoryItem.legacyResourceId", "duplicateSkuCount", "inventoryHistoryUrl", "locationsCount", "harmonizedSystemCode", "countryCodeOfOrigin", "provinceCodeOfOrigin", "tracked", "trackedEditable", "unitCost.amount", "unitCost.currencyCode"];
    readonly locations: readonly [...("name" | "id" | "isActive" | "activatable" | "addressVerified" | "deactivatable" | "deactivatedAt" | "deletable" | "fulfillsOnlineOrders" | "hasActiveInventory" | "hasUnfulfilledOrders" | "legacyResourceId" | "shipsInventory")[], "address1", "address2", "city", "country", "countryCode", "latitude", "longitude", "phone", "province", "provinceCode", "zip", "fulfillmentService.id", "fulfillmentService.handle", "fulfillmentService.type"];
    readonly inventory_levels: readonly [...("id" | "available" | "canDeactivate" | "createdAt" | "deactivationAlert" | "deactivationAlertHtml" | "incoming" | "updatedAt" | "location")[], "inventoryItem.id", "location.id", "location.isActive", "location.name", "productVariant.id", "productVariant.sku", "productVariant.title", "product.title", "product.id", "product.handle", "productVariant"];
    readonly line_items: readonly [...("name" | "grams" | "price" | "product_id" | "quantity" | "requires_shipping" | "sku" | "title" | "variant_id" | "variant_title" | "vendor" | "gift_card" | "properties" | "taxable" | "total_discount")[], "order_id", "order", "tax_lines_json", "id", "variant", "duties_json", "discount_allocations_json", "total_grams", "total_item_price"];
    readonly customers: readonly [...("created_at" | "currency" | "email" | "name" | "note" | "phone" | "tags" | "updated_at" | "first_name" | "last_name" | "last_order_id" | "last_order_name" | "multipass_identifier" | "orders_count" | "state" | "tax_exempt" | "total_spent" | "tax_exemptions" | "verified_email")[], "id", "addresses_json", "average_order_value", "default_address.address1", "default_address.address2", "default_address.city", "default_address.company", "default_address.country", "default_address.country_code", "default_address.first_name", "default_address.id", "default_address.last_name", "default_address.phone", "default_address.province", "default_address.province_code", "default_address.zip", "email_marketing_consent.opt_in_level", "email_marketing_consent.state", "email_marketing_consent.updated_at", "sms_marketing_consent.collected_from", "sms_marketing_consent.opt_in_level", "sms_marketing_consent.state", "sms_marketing_consent.updated_at"];
};
export declare type ModelPropsKey = {
    [OrderTypeName]: OrderPropsKey;
    [ProductTypeName]: ProductKey;
    [ProductVariantTypeName]: ProductVariantKey;
    [LocationTypeName]: LocationKey;
    [InventoryLevelTypeName]: InventoryLevelKey;
    [LineItemTypeName]: LineItemKey;
    [CustomerTypeName]: CustomerKey;
};
