import { AxiosRequestConfig, AxiosHeaders } from 'axios';

interface PaginationResult {
    total: number;
    current: number;
    next: number;
    prev: number;
    per_page: number;
}
interface ListResultMetadata {
    code: number;
    pagination?: PaginationResult;
}
interface RequestOptions {
    population?: string;
    filter?: Record<string, any>;
    limit?: number;
    page?: number;
    sort?: string | number | Record<string, any>;
}
declare enum SessionEnvironment {
    SANDBOX = "sandbox",
    PRODUCTION = "production"
}
interface SessionOptions {
    key?: string;
    environment?: SessionEnvironment;
}

interface APIKey {
    name: string;
    redacted_token: string;
    permissions: string[];
    public_id: string;
    created_at: string;
    updated_at: string;
}
interface APIKeyListResult {
    meta: ListResultMetadata;
    data: APIKey[];
}
interface APIKeyResult {
    meta: ListResultMetadata;
    data: APIKey;
}
interface APIKeyDeleteResult {
    id: string;
}

interface Workspace {
    name: string;
    created_at: string;
    updated_at: string;
    public_id: string;
}
interface WorkspaceListResult {
    meta: ListResultMetadata;
    data: Workspace[];
}
interface WorkspaceWhereResult {
    meta: ListResultMetadata;
    data: Workspace;
}

interface RequestDocument {
    url: string;
    mimetype: string;
    public_id: string;
    created_at: string;
    updated_at: string;
}
interface Request {
    status: string;
    expiration: string | null;
    message: {
        subject: string;
        body: string | null;
    };
    tags: string[];
    public_id: string;
    created_at: string;
    updated_at: string;
    documents: RequestDocument[];
}
interface RequestListResult {
    meta: ListResultMetadata;
    data: Request[];
}
interface RequestResult {
    meta: ListResultMetadata;
    data: Request;
}

interface Template {
    tags: string[];
    created_at: string;
    updated_at: string;
    name: string;
    recipient_aliases: {
        alias_id: string;
        description: string;
        action: string;
    }[];
    public_id: string;
}
interface TemplateListResult {
    meta: ListResultMetadata;
    data: Template[];
}
interface TemplateResult {
    meta: ListResultMetadata;
    data: Template;
}
interface TemplateDeleteResult {
    id: string;
}
declare class RequestMessage {
    subject: string;
    body?: string;
}
declare class TemplateRecipient {
    id: string;
    name: string;
    email: string;
    access_code?: string;
    private_message?: string;
    fillable?: Record<string, any>;
}
interface TemplateTransformRequest {
    expiration?: string;
    message?: RequestMessage;
    recipients: TemplateRecipient[];
}

declare enum WebhookStatus {
    active = "active",
    inactive = "inactive"
}
declare enum WebhookEventType {
    DOCUMENT_VIEWED = "document.viewed",
    DOCUMENT_SIGNED = "document.signed",
    DOCUMENT_REJECTED = "document.rejected",
    DOCUMENT_COMPLETED = "document.completed"
}
interface Webhook {
    endpoint_url: string;
    event_types: string[];
    status: WebhookStatus;
    public_id: string;
    signing_token: string;
    created_at: string;
    updated_at: string;
}
interface WebhookListResult {
    meta: ListResultMetadata;
    data: Webhook[];
}
interface WebhookResult {
    meta: ListResultMetadata;
    data: Webhook;
}
interface WebhookDeleteResult {
    id: string;
}
interface CreateWebhook {
    endpoint_url: string;
    event_types: WebhookEventType[];
}

declare abstract class APIDefinition {
    protected abstract extendConfig(config: AxiosRequestConfig): AxiosRequestConfig;
    protected abstract baseConfig: AxiosRequestConfig;
    protected abstract headers: AxiosHeaders;
    abstract list(options?: RequestOptions): Promise<any>;
    abstract get(id: string, options?: RequestOptions): Promise<any>;
}

declare class Keys extends APIDefinition {
    private readonly DSFactory;
    readonly headers: AxiosHeaders;
    protected readonly baseConfig: AxiosRequestConfig;
    constructor(DSFactory: DSFactory);
    protected extendConfig: (config: AxiosRequestConfig) => AxiosRequestConfig;
    list(options?: RequestOptions): Promise<APIKeyListResult>;
    delete(key: string): Promise<APIKeyDeleteResult>;
    get(key: string, options?: RequestOptions): Promise<APIKeyResult>;
}

declare class Workspaces {
    private readonly DSFactory;
    readonly headers: AxiosHeaders;
    baseConfig: AxiosRequestConfig;
    constructor(DSFactory: DSFactory);
    protected extendConfig: (config: AxiosRequestConfig) => AxiosRequestConfig;
    list(options?: RequestOptions): Promise<WorkspaceListResult>;
    get(id: string): Promise<WorkspaceWhereResult>;
}

declare class Webhooks {
    private readonly DSFactory;
    headers: AxiosHeaders;
    baseConfig: AxiosRequestConfig;
    constructor(DSFactory: DSFactory);
    protected extendConfig: (config: AxiosRequestConfig) => AxiosRequestConfig;
    workspace(workspaceId: string): Webhooks;
    private addWSIdentifier;
    list(options?: RequestOptions): Promise<WebhookListResult>;
    delete(id: string): Promise<WebhookDeleteResult>;
    get(id: string, options?: RequestOptions): Promise<WebhookResult>;
    rotateKey(id: string): Promise<WebhookResult>;
    update(id: string, payload: Partial<CreateWebhook>, params?: Record<string, any>): Promise<WebhookResult>;
    create(payload: CreateWebhook, params?: Record<string, any>): Promise<WebhookResult>;
}

declare class Templates {
    private readonly DSFactory;
    headers: AxiosHeaders;
    baseConfig: AxiosRequestConfig;
    constructor(DSFactory: DSFactory);
    protected extendConfig: (config: AxiosRequestConfig) => AxiosRequestConfig;
    workspace(workspaceId: string): Templates;
    private addWSIdentifier;
    list(options?: RequestOptions): Promise<TemplateListResult>;
    get(id: string, options?: RequestOptions): Promise<TemplateResult>;
    transform(id: string, payload: TemplateTransformRequest, options?: RequestOptions): Promise<TemplateResult>;
    private validateTransform;
}

declare class DSFactory {
    private readonly apiKey;
    private readonly token;
    private readonly organisationId;
    readonly env: SessionEnvironment;
    readonly headers: AxiosHeaders;
    readonly keys: Keys;
    readonly workspaces: Workspaces;
    readonly webhooks: Webhooks;
    readonly templates: Templates;
    constructor(apiKey: string, token: string, organisationId: string, env: SessionEnvironment);
}
declare function createSession(options?: SessionOptions): Promise<DSFactory>;

export { type APIKey, type APIKeyDeleteResult, type APIKeyListResult, type APIKeyResult, type CreateWebhook, type ListResultMetadata, type PaginationResult, type Request, type RequestListResult, RequestMessage, type RequestOptions, type RequestResult, SessionEnvironment, type SessionOptions, type Template, type TemplateDeleteResult, type TemplateListResult, TemplateRecipient, type TemplateResult, type TemplateTransformRequest, type Webhook, type WebhookDeleteResult, WebhookEventType, type WebhookListResult, type WebhookResult, WebhookStatus, type Workspace, type WorkspaceListResult, type WorkspaceWhereResult, createSession };
