import { InputFile, EBookParser, FileInfo } from '@lingo-reader/shared';

interface Fb2Resource {
  id: string
  // mimetyoe
  contentType: string
  // base64
  base64Data: string
}

type Fb2ResourceMap = Map<string, Fb2Resource>

interface Author {
  name: string
  firstName: string
  middleName: string
  lastName: string
  nickname?: string
  homePage?: string
  email?: string
}

// title-info
interface TitleInfo {
  // alias of book-title
  title?: string
  // alias of genre
  type?: string
  author?: Author
  // alias of lang
  language?: string
  // alias of annotation
  description?: string
  keywords?: string
  // date that the book was written
  date?: string
  srcLang?: string
  translator?: string
  coverImageId?: string
}

// document-info
interface DocumentInfo {
  author?: Author
  // alias of id
  id?: string
  programUsed?: string
  srcUrl?: string
  srcOcr?: string
  version?: string
  // html, need to format node
  history?: string
  date?: string
}

// publish-info
interface PublishInfo {
  bookName?: string
  publisher?: string
  city?: string
  year?: string
  isbn?: string
}

type CustomInfo = Record<string, string>

type Fb2Metadata = Omit<TitleInfo, 'coverImageId'> & DocumentInfo & PublishInfo & CustomInfo

interface Fb2SpineItem {
  id: string
}

type Fb2Spine = Fb2SpineItem[]

interface Fb2TocItem {
  label: string
  href: string
}

type Fb2Toc = Fb2TocItem[]

interface Fb2Chapter {
  id: string
  name?: string
  sectionNode: any
}

type Fb2ChapterMap = Map<string, Fb2Chapter>

interface BodyWithName {
  name: string
  sectionNode: any
}

type Fb2RemainingBodys = BodyWithName[]

interface Fb2ResolvedHref {
  id: string
  selector: string
}

interface Fb2CssPart {
  id: string
  href: string
}

interface Fb2ProcessedChapter {
  html: string
  css: Fb2CssPart[]
}

declare function initFb2File(fb2: InputFile, resourceSaveDir?: string): Promise<Fb2File>;
declare class Fb2File implements EBookParser {
    private fb2;
    private resourceSaveDir;
    private resourceStore;
    private resourceCache;
    private chapterCache;
    private stylesheetUrl;
    private chapterStore;
    private idToChapterIdMap;
    private tableOfContent;
    getToc(): Fb2Toc;
    private spine;
    getSpine(): Fb2Spine;
    private metadata;
    getMetadata(): Fb2Metadata;
    private fileName;
    getFileInfo(): FileInfo;
    private coverImageId;
    getCoverImage(): string;
    constructor(fb2: InputFile, resourceSaveDir?: string);
    loadFb2(): Promise<void>;
    private serializeAttr;
    private serializeChildren;
    private serializeNode;
    loadChapter(id: string): Fb2ProcessedChapter | undefined;
    resolveHref(fb2Href: string): Fb2ResolvedHref | undefined;
    destroy(): void;
}

declare const HREF_PREFIX = "fb2:";
declare const ID_PREFIX = "lingo_fb2_";
declare const STYLESHEET_ID = "lingo_fb2_style";

export { type Author, type BodyWithName, type CustomInfo, type DocumentInfo, type Fb2Chapter, type Fb2ChapterMap, type Fb2CssPart, Fb2File, type Fb2Metadata, type Fb2ProcessedChapter, type Fb2RemainingBodys, type Fb2ResolvedHref, type Fb2Resource, type Fb2ResourceMap, type Fb2Spine, type Fb2SpineItem, type Fb2Toc, type Fb2TocItem, HREF_PREFIX, ID_PREFIX, type PublishInfo, STYLESHEET_ID, type TitleInfo, initFb2File };
