import { EmitterWebhookEventName, EmitterWebhookEvent } from '@octokit/webhooks';
import * as _ubiquity_os_ubiquity_os_logger from '@ubiquity-os/ubiquity-os-logger';
import { LogReturn, Metadata, Logs } from '@ubiquity-os/ubiquity-os-logger';
import { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';
import { customOctokit } from './octokit.mjs';

interface CommentOptions {
    raw?: boolean;
    updateComment?: boolean;
    commentKind?: string;
}
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;
}
type GraphqlCommentNode = {
    id: string;
    body?: string | null;
    isMinimized?: boolean | null;
    minimizedReason?: string | null;
    author?: {
        login?: string | null;
    } | null;
};
declare class CommentHandler {
    static readonly HEADER_NAME = "UbiquityOS";
    private _lastCommentId;
    private _commandResponsePolicyApplied;
    _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;
    _getCommentNodeId(context: Context): string | null;
    _extractIssueContext(context: Context): IssueContext | null;
    _extractIssueLocator(context: Context): {
        owner: string;
        repo: string;
        issueNumber: number;
    } | null;
    _shouldApplyCommandResponsePolicy(context: Context): boolean;
    _isCommandResponseComment(body: string | null | undefined): boolean;
    _getGraphqlClient(context: Context): ((query: string, variables?: Record<string, unknown>) => Promise<unknown>) | null;
    _fetchRecentComments(context: Context, locator: {
        owner: string;
        repo: string;
        issueNumber: number;
    }, last?: number): Promise<GraphqlCommentNode[]>;
    _findPreviousCommandResponseComment(comments: GraphqlCommentNode[], currentCommentId: string | null): GraphqlCommentNode | null;
    _minimizeComment(context: Context, commentNodeId: string, classifier?: "RESOLVED" | "OUTDATED"): Promise<void>;
    _applyCommandResponsePolicy(context: Context): Promise<void>;
    _processMessage(context: Context, message: LogReturn | Error): {
        metadata: {
            status?: number | undefined;
            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): {
        header: string;
        jsonPretty: string;
    };
    _formatMetadataContent(logMessage: LogReturn["logMessage"], header: string, jsonPretty: string): string;
    createCommentBody(context: Context, message: LogReturn | Error, options?: Pick<CommentOptions, "raw">): string;
    private _createCommentBody;
    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;
    authToken: string;
    ubiquityKernelToken?: string;
    octokit: InstanceType<typeof customOctokit>;
    config: TConfig;
    env: TEnv;
    logger: Logs;
    commentHandler: CommentHandler;
}

export { type Context as C, CommentHandler as a };
