import * as hono_types from 'hono/types';
import { EmitterWebhookEventName, EmitterWebhookEvent } from '@octokit/webhooks';
import { Hono } from 'hono';
import * as _ubiquity_os_ubiquity_os_logger from '@ubiquity-os/ubiquity-os-logger';
import { LogReturn, Metadata, Logs, LogLevel } from '@ubiquity-os/ubiquity-os-logger';
import { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';
import { customOctokit } from './octokit.mjs';
import { Manifest } from './manifest.mjs';
import { TAnySchema } from '@sinclair/typebox';
import '@octokit/core/dist-types/types';
import '@octokit/plugin-paginate-graphql';
import '@octokit/plugin-paginate-rest';
import '@octokit/request-error';
import '@octokit/core';

interface CommentOptions {
    raw?: boolean;
    updateComment?: boolean;
}
type PostedGithubComment = RestEndpointMethodTypes["issues"]["updateComment"]["response"]["data"] | RestEndpointMethodTypes["issues"]["createComment"]["response"]["data"] | RestEndpointMethodTypes["pulls"]["createReplyForReviewComment"]["response"]["data"];
type WithIssueNumber<T> = T & {
    issueNumber: number;
};
interface IssueContext {
    issueNumber: number;
    commentId?: number;
    owner: string;
    repo: string;
}
declare class CommentHandler {
    static readonly HEADER_NAME = "UbiquityOS";
    private _lastCommentId;
    _updateIssueComment(context: Context, params: {
        owner: string;
        repo: string;
        body: string;
        issueNumber: number;
    }): Promise<WithIssueNumber<PostedGithubComment>>;
    _updateReviewComment(context: Context, params: {
        owner: string;
        repo: string;
        body: string;
        issueNumber: number;
    }): Promise<WithIssueNumber<PostedGithubComment>>;
    _createNewComment(context: Context, params: {
        owner: string;
        repo: string;
        body: string;
        issueNumber: number;
        commentId?: number;
    }): Promise<WithIssueNumber<PostedGithubComment>>;
    _getIssueNumber(context: Context): number | undefined;
    _getCommentId(context: Context): number | undefined;
    _extractIssueContext(context: Context): IssueContext | null;
    _processMessage(context: Context, message: LogReturn | Error): Promise<{
        metadata: {
            message: string;
            name: string;
            stack: string | undefined;
        };
        logMessage: {
            raw: string;
            diff: string;
            level: _ubiquity_os_ubiquity_os_logger.LogLevel;
            type: _ubiquity_os_ubiquity_os_logger.LogLevelWithOk;
        };
    } | {
        metadata: {
            message: string | undefined;
            stack: string | string[] | undefined;
            caller: {} | undefined;
            error?: Error | {
                stack: string;
            } | undefined;
            name?: string | undefined;
        } | {
            logMessage: {
                raw: string;
                diff: string;
                level: _ubiquity_os_ubiquity_os_logger.LogLevel;
                type: _ubiquity_os_ubiquity_os_logger.LogLevelWithOk;
            };
            metadata?: Metadata;
        };
        logMessage: {
            raw: string;
            diff: string;
            level: _ubiquity_os_ubiquity_os_logger.LogLevel;
            type: _ubiquity_os_ubiquity_os_logger.LogLevelWithOk;
        };
    }>;
    _getInstigatorName(context: Context): string;
    _createMetadataContent(context: Context, metadata: Metadata): Promise<{
        header: string;
        jsonPretty: string;
    }>;
    _formatMetadataContent(logMessage: LogReturn["logMessage"], header: string, jsonPretty: string): string;
    _createCommentBody(context: Context, message: LogReturn | Error, options: CommentOptions): Promise<string>;
    postComment(context: Context, message: LogReturn | Error, options?: CommentOptions): Promise<WithIssueNumber<PostedGithubComment> | null>;
}

interface Context<TConfig = unknown, TEnv = unknown, TCommand = unknown, TSupportedEvents extends EmitterWebhookEventName = EmitterWebhookEventName> {
    eventName: TSupportedEvents;
    payload: {
        [K in TSupportedEvents]: K extends EmitterWebhookEventName ? EmitterWebhookEvent<K> : never;
    }[TSupportedEvents]["payload"];
    command: TCommand | null;
    octokit: InstanceType<typeof customOctokit>;
    config: TConfig;
    env: TEnv;
    logger: Logs;
    commentHandler: CommentHandler;
}

type Return = Record<string, unknown> | undefined | void;
type HandlerReturn = Promise<Return> | Return;

interface Options {
    kernelPublicKey?: string;
    logLevel?: LogLevel;
    postCommentOnError?: boolean;
    settingsSchema?: TAnySchema;
    envSchema?: TAnySchema;
    commandSchema?: TAnySchema;
    /**
     * @deprecated This disables signature verification - only for local development
     */
    bypassSignatureVerification?: boolean;
}

declare function createPlugin<TConfig = unknown, TEnv = unknown, TCommand = unknown, TSupportedEvents extends EmitterWebhookEventName = EmitterWebhookEventName>(handler: (context: Context<TConfig, TEnv, TCommand, TSupportedEvents>) => HandlerReturn, manifest: Manifest, options?: Options): Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">;

declare function createActionsPlugin<TConfig = unknown, TEnv = unknown, TCommand = unknown, TSupportedEvents extends EmitterWebhookEventName = EmitterWebhookEventName>(handler: (context: Context<TConfig, TEnv, TCommand, TSupportedEvents>) => HandlerReturn, options?: Options): Promise<void>;

export { CommentHandler, type Context, type Options, createActionsPlugin, createPlugin };
