import { type Plugin, type TrackDateResult, type TrackYearResult, type CalendarDay, type CalendarMark, type WcYear, type WcMark, type WcScheduleMark, type WcAnnualMark, type PluginService, type WcScheduleInfo, type Nullable } from '@lspriv/wx-calendar/lib';
type PropsReturn<R, P extends any[] = []> = (properties: JCalPropDict, ...args: P) => R | undefined;
type ICSComponentType = 'event' | 'alarm' | 'todo' | 'journal';
type ICSCompTypeOpt<K extends string | void, T> = {
    [P in ICSComponentType as K extends string ? `${P}${K}` : P]?: T;
};
type ICSCompTypeOpts = ICSCompTypeOpt<void, PropsReturn<ICSMark, [key: string]>> & ICSCompTypeOpt<'MarkAs', CalendarMark['type'] | Array<CalendarMark['type']>> & ICSCompTypeOpt<'FestivalName', PropsReturn<string>> & ICSCompTypeOpt<'FestivalColor', string | PropsReturn<string>> & ICSCompTypeOpt<'CornerText', PropsReturn<string>> & ICSCompTypeOpt<'CornerColor', string | PropsReturn<string>> & ICSCompTypeOpt<'ScheduleText', PropsReturn<string>> & ICSCompTypeOpt<'ScheduleColor', string | PropsReturn<string>> & ICSCompTypeOpt<'ScheduleBgColor', string | PropsReturn<string>>;
export type ICSOpts = ICSCompTypeOpts & {
    subcribes?: Array<ICSSubcribe>;
    parseDate?: PropsReturn<CalendarDay>;
    collectAnuualMark?: PropsReturn<WcAnnualMark, [sets: ICSAnnualMarkMap]>;
    afterMarked?: (options: ICSSubcribeOpts, instance: ICSPlugin) => void;
};
type ICSCommonOpts = Omit<ICSOpts, 'subcribes'>;
export interface ICSOptsGeneration {
    (instance: ICSPlugin): ICSOpts;
}
type ICSSubcribeOpts = ICSCommonOpts & {
    calname?: string;
    icskey?: string;
};
export interface ICSSubcribeGeneration {
    (instance: ICSPlugin): ICSSubcribe;
}
export interface ICSSubcribeOptsGeneration {
    (instance: ICSPlugin): ICSSubcribeOpts;
}
export type ICSSubcribe = ICSSubcribeOpts & {
    kind?: 'link' | 'file' | 'content';
    source: string;
};
interface JCalPropDict {
    [x: string | symbol]: any;
    compname: string;
    icskey?: string;
    date?: CalendarDay;
}
export interface CurrentSeries {
    date?: number;
    name?: string;
}
type ICSScheduleMark = WcScheduleMark & {
    dtstart: string;
    dtend: string;
    summary?: string;
    description?: string;
};
export type ICSMark = {
    [P in keyof TrackDateResult]?: P extends 'schedule' ? ICSScheduleMark : WcMark;
};
type ICSMarkSets = {
    [P in keyof ICSMark]-?: Array<Required<ICSMark>[P]>;
};
type ICSAnnualMark = WcAnnualMark & {
    key: string;
};
type ICSAnnualMarkMap = Map<string, Array<ICSAnnualMark>>;
type PossibleFuncParams<T> = T extends (...args: any[]) => any ? Parameters<T> : never;
type PossibleFuncReturn<T> = T extends (...args: any[]) => any ? ReturnType<T> : T;
export declare const execPossibleFunc: <T>(possibleFunc: T, ...args: PossibleFuncParams<T>) => PossibleFuncReturn<T>;
export declare class ICSPlugin implements Plugin {
    static KEY: "wc-plugin-ics";
    private options;
    private subcribes?;
    marks: Map<string, ICSMarkSets>;
    annualMarks: ICSAnnualMarkMap;
    service?: PluginService;
    constructor(options?: ICSOpts | ICSOptsGeneration);
    PLUGIN_INITIALIZE(service: PluginService): Promise<void>;
    private formOptions;
    /**
     * 加载订阅
     * @param subcribes 订阅集合
     */
    private loadSubcribes;
    /**
     * 加载 ICS
     * @param source 来源
     * @param type 类型 link来自连接 file本地文件 content订阅内容
     */
    private loadICS;
    load(subscribe: ICSSubcribe | ICSSubcribeGeneration): Promise<string>;
    load(source: string, type?: ICSSubcribe['kind'], options?: ICSSubcribeOpts | ICSSubcribeOptsGeneration): Promise<string>;
    /**
     * 读取本地文件内容
     * @param path 要读取的文件的路径 (本地路径)
     */
    private parseFile;
    private parseJCal;
    private generateMarks;
    private assignComponentHandle;
    private createIcsMark;
    private collectMark;
    private collectAnnualMark;
    /**
     * 移除订阅
     * @param icskey key
     */
    remove(icskey: string): Promise<void>;
    PLUGIN_TRACK_DATE(date: CalendarDay): Nullable<TrackDateResult>;
    PLUGIN_TRACK_YEAR(year: WcYear): Nullable<TrackYearResult>;
    PLUGIN_TRACK_SCHEDULE(date: CalendarDay, id?: string): Nullable<WcScheduleInfo>;
    PLUGIN_ON_DETACHED(): void;
}
export declare const ICS_PLUGIN_KEY: "wc-plugin-ics";
export {};
