import { Schema, TransactionalDatabase, Querier } from '@platform-modules/db';
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';

declare const entitlements: drizzle_orm_pg_core.PgTableWithColumns<{
    name: "entitlements";
    schema: undefined;
    columns: {
        account: drizzle_orm_pg_core.PgColumn<{
            name: "account";
            tableName: "entitlements";
            dataType: "string";
            columnType: "PgText";
            data: string;
            driverParam: string;
            notNull: true;
            hasDefault: false;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: [string, ...string[]];
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
        capability: drizzle_orm_pg_core.PgColumn<{
            name: "capability";
            tableName: "entitlements";
            dataType: "string";
            columnType: "PgText";
            data: string;
            driverParam: string;
            notNull: true;
            hasDefault: false;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: [string, ...string[]];
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
        tier: drizzle_orm_pg_core.PgColumn<{
            name: "tier";
            tableName: "entitlements";
            dataType: "string";
            columnType: "PgText";
            data: string;
            driverParam: string;
            notNull: true;
            hasDefault: false;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: [string, ...string[]];
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
        grantedAt: drizzle_orm_pg_core.PgColumn<{
            name: "granted_at";
            tableName: "entitlements";
            dataType: "date";
            columnType: "PgTimestamp";
            data: Date;
            driverParam: string;
            notNull: true;
            hasDefault: true;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: undefined;
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
        expiresAt: drizzle_orm_pg_core.PgColumn<{
            name: "expires_at";
            tableName: "entitlements";
            dataType: "date";
            columnType: "PgTimestamp";
            data: Date;
            driverParam: string;
            notNull: false;
            hasDefault: false;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: undefined;
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
    };
    dialect: "pg";
}>;
declare const entitlementTierGrants: drizzle_orm_pg_core.PgTableWithColumns<{
    name: "entitlement_tier_grants";
    schema: undefined;
    columns: {
        capability: drizzle_orm_pg_core.PgColumn<{
            name: "capability";
            tableName: "entitlement_tier_grants";
            dataType: "string";
            columnType: "PgText";
            data: string;
            driverParam: string;
            notNull: true;
            hasDefault: false;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: [string, ...string[]];
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
        tier: drizzle_orm_pg_core.PgColumn<{
            name: "tier";
            tableName: "entitlement_tier_grants";
            dataType: "string";
            columnType: "PgText";
            data: string;
            driverParam: string;
            notNull: true;
            hasDefault: false;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: [string, ...string[]];
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
        quotaKey: drizzle_orm_pg_core.PgColumn<{
            name: "quota_key";
            tableName: "entitlement_tier_grants";
            dataType: "string";
            columnType: "PgText";
            data: string;
            driverParam: string;
            notNull: true;
            hasDefault: true;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: [string, ...string[]];
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
        quotaValue: drizzle_orm_pg_core.PgColumn<{
            name: "quota_value";
            tableName: "entitlement_tier_grants";
            dataType: "number";
            columnType: "PgInteger";
            data: number;
            driverParam: string | number;
            notNull: false;
            hasDefault: false;
            isPrimaryKey: false;
            isAutoincrement: false;
            hasRuntimeDefault: false;
            enumValues: undefined;
            baseColumn: never;
            identity: undefined;
            generated: undefined;
        }, {}, {}>;
    };
    dialect: "pg";
}>;
declare const entitlementsSchema: {
    entitlements: drizzle_orm_pg_core.PgTableWithColumns<{
        name: "entitlements";
        schema: undefined;
        columns: {
            account: drizzle_orm_pg_core.PgColumn<{
                name: "account";
                tableName: "entitlements";
                dataType: "string";
                columnType: "PgText";
                data: string;
                driverParam: string;
                notNull: true;
                hasDefault: false;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: [string, ...string[]];
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
            capability: drizzle_orm_pg_core.PgColumn<{
                name: "capability";
                tableName: "entitlements";
                dataType: "string";
                columnType: "PgText";
                data: string;
                driverParam: string;
                notNull: true;
                hasDefault: false;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: [string, ...string[]];
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
            tier: drizzle_orm_pg_core.PgColumn<{
                name: "tier";
                tableName: "entitlements";
                dataType: "string";
                columnType: "PgText";
                data: string;
                driverParam: string;
                notNull: true;
                hasDefault: false;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: [string, ...string[]];
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
            grantedAt: drizzle_orm_pg_core.PgColumn<{
                name: "granted_at";
                tableName: "entitlements";
                dataType: "date";
                columnType: "PgTimestamp";
                data: Date;
                driverParam: string;
                notNull: true;
                hasDefault: true;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: undefined;
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
            expiresAt: drizzle_orm_pg_core.PgColumn<{
                name: "expires_at";
                tableName: "entitlements";
                dataType: "date";
                columnType: "PgTimestamp";
                data: Date;
                driverParam: string;
                notNull: false;
                hasDefault: false;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: undefined;
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
        };
        dialect: "pg";
    }>;
    entitlementTierGrants: drizzle_orm_pg_core.PgTableWithColumns<{
        name: "entitlement_tier_grants";
        schema: undefined;
        columns: {
            capability: drizzle_orm_pg_core.PgColumn<{
                name: "capability";
                tableName: "entitlement_tier_grants";
                dataType: "string";
                columnType: "PgText";
                data: string;
                driverParam: string;
                notNull: true;
                hasDefault: false;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: [string, ...string[]];
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
            tier: drizzle_orm_pg_core.PgColumn<{
                name: "tier";
                tableName: "entitlement_tier_grants";
                dataType: "string";
                columnType: "PgText";
                data: string;
                driverParam: string;
                notNull: true;
                hasDefault: false;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: [string, ...string[]];
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
            quotaKey: drizzle_orm_pg_core.PgColumn<{
                name: "quota_key";
                tableName: "entitlement_tier_grants";
                dataType: "string";
                columnType: "PgText";
                data: string;
                driverParam: string;
                notNull: true;
                hasDefault: true;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: [string, ...string[]];
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
            quotaValue: drizzle_orm_pg_core.PgColumn<{
                name: "quota_value";
                tableName: "entitlement_tier_grants";
                dataType: "number";
                columnType: "PgInteger";
                data: number;
                driverParam: string | number;
                notNull: false;
                hasDefault: false;
                isPrimaryKey: false;
                isAutoincrement: false;
                hasRuntimeDefault: false;
                enumValues: undefined;
                baseColumn: never;
                identity: undefined;
                generated: undefined;
            }, {}, {}>;
        };
        dialect: "pg";
    }>;
};

type EntitlementGrant = typeof entitlements.$inferSelect;
type EntitlementTierGrant = typeof entitlementTierGrants.$inferSelect;
type EntitlementsSchema = typeof entitlementsSchema;
type EntitlementSubject = string | {
    account: string;
    tenancy?: string | null;
};
type TierRef = {
    capability: string;
    tier: string;
};
type EntitlementClock = {
    __entitlementsNow?: () => Date;
};
type EntitlementQuerier<S extends Schema = Record<string, never>> = Querier<S & EntitlementsSchema>;
type EntitlementDatabase<S extends Schema = Record<string, never>> = TransactionalDatabase<S & EntitlementsSchema> & EntitlementClock;
type EntitlementsService = {
    can(subject: EntitlementSubject, capability: string): Promise<boolean>;
    quota(subject: EntitlementSubject, key: string): Promise<number>;
    setTier(subject: EntitlementSubject, tier: TierRef): Promise<void>;
};

declare class EntitlementTierError extends Error {
    readonly tier: string;
    readonly name = "EntitlementTierError";
    readonly code: "ENTITLEMENT_TIER";
    constructor(tier: string);
}
declare class EntitlementFeatureError extends Error {
    readonly tier: string;
    readonly feature: string;
    readonly name = "EntitlementFeatureError";
    readonly code: "ENTITLEMENT_FEATURE";
    constructor(tier: string, feature: string);
}
type EntitlementError = EntitlementTierError | EntitlementFeatureError;
declare function isEntitlementTierError(error: unknown): error is EntitlementTierError;
declare function isEntitlementFeatureError(error: unknown): error is EntitlementFeatureError;
declare function isEntitlementError(error: unknown): error is EntitlementError;

declare function createEntitlements<S extends Schema>(input: {
    db: EntitlementDatabase<S>;
}): EntitlementsService;

export { type EntitlementClock, type EntitlementDatabase, type EntitlementError, EntitlementFeatureError, type EntitlementGrant, type EntitlementQuerier, type EntitlementSubject, EntitlementTierError, type EntitlementTierGrant, type EntitlementsSchema, type EntitlementsService, type TierRef, createEntitlements, entitlementTierGrants, entitlements, entitlementsSchema, isEntitlementError, isEntitlementFeatureError, isEntitlementTierError };
