import { BSPlugin, ReqRes } from '@bs-core/shell';

type AuthDetails = {
    username: string;
    password: string;
};
type JiraConfig = {
    server: string;
    user: string;
    password: string;
    sessionRefreshPeriod?: number;
};
type FieldDict = {
    byName: Record<string, {
        id: string;
        type: string;
        itemType: string;
    }>;
    byId: Record<string, {
        name: string;
        type: string;
        itemType: string;
    }>;
};
type DashboardsOject = {
    name: string;
    values: [number, string][];
};
type FiltersOject = {
    name: string;
    values: [number, string][];
};
type JqlResults = {
    startAt: number;
    maxResults: number;
    total: number;
    issues: {
        key: string;
    }[];
};
declare const JiraResources: Record<string, string>;
declare class Jira extends BSPlugin {
    private _server;
    private _user;
    private _password;
    private _sessionId;
    private _sessionRefreshPeriod;
    private _timeout?;
    private _fieldDict;
    private _sessionHeader;
    private _basicAuthHeader;
    constructor(name: string, jiraConfig: JiraConfig);
    login(auth?: AuthDetails): Promise<void>;
    logout(): Promise<void>;
    getFieldDict(useCurrent?: boolean): Promise<FieldDict>;
    getAllowedFieldValues(projectKey: string, issueType: string, fieldName: string): Promise<string[]>;
    getComponents(projectKey: string): Promise<{
        [key: string]: string;
    }>;
    getProjects(component?: string): Promise<any[]>;
    updateProject(project: string, body: Record<string, string>): Promise<void>;
    updateProjectLead(project: string, lead: string): Promise<void>;
    createIssue(projectKey: string, issueType: string, component: string, fields: Record<string, any>): Promise<string>;
    updateIssue(key: string, fields: Record<string, any>, notifyUsers?: boolean): Promise<string>;
    getIssue(idOrKey: string): Promise<any>;
    issueReporter(key: string, reporter: string, notifyUsers?: boolean): Promise<void>;
    assignIssue(key: string, assignee: string, notifyUsers?: boolean): Promise<void>;
    updateLabels(key: string, action: "add" | "remove", labels: string[], notifyUsers?: boolean): Promise<string>;
    addComment(idOrKey: string, comment: string): Promise<void>;
    addWatcher(idOrKey: string, watcher: string): Promise<void>;
    removeWatcher(idOrKey: string, watcher: string): Promise<void>;
    getTransitions(idOrKey: string): Promise<Record<string, string>>;
    doTransition(idOrKey: string, transitionIdOrName: string, fields?: string[], comment?: string): Promise<void>;
    runJql(jql: string): Promise<string[]>;
    getUserDashboardIds(userId: string): Promise<number[]>;
    getUserFilterIds(userId: string): Promise<string[]>;
    migrateDashboards(fromUserId: string, toUserId: string, dashboardIds: number[]): Promise<void>;
    migrateFilters(fromUserId: string, toUserId: string, filterIds: string[]): Promise<void>;
    getUser(user: string, byKey: boolean, includeGroups?: boolean): Promise<any>;
    addUserToGroup(user: string, group: string): Promise<Object>;
    getUserGroups(user: string): Promise<string[]>;
    addUserToApplication(user: string, applicationKey: string): Promise<void>;
    restApiCall(method: "GET" | "PUT" | "POST" | "DELETE" | "PATCH", path: string, body: any): Promise<ReqRes>;
}

export { type AuthDetails, type DashboardsOject, type FieldDict, type FiltersOject, Jira, type JiraConfig, JiraResources, type JqlResults };
