import {
    KeyGlamorousComponentFactory,
    GlamorousOptions,
    CSSProperties,
    SVGProperties,
    PropsAreCssOverridesGlamorousOptions,
    KeyGlamorousComponentFactoryCssOverides,
} from './glamorous'

export interface DOMTagGlamorousComponentFactory<Key extends keyof HTMLDomTags>  {
    <ExternalProps, Context = object, DefaultProps extends object = object>(
        component: Key,
        options?: Partial<GlamorousOptions<ExternalProps, Context, DefaultProps>>,
    ): KeyGlamorousComponentFactory<
        React.HTMLProps<HTMLDomTags[Key]>, CSSProperties, ExternalProps, DefaultProps
    >

    <ExternalProps, Context = object, DefaultProps extends object = object>(
        component: Key,
        options?: PropsAreCssOverridesGlamorousOptions<ExternalProps, Context, DefaultProps>,
    ): KeyGlamorousComponentFactoryCssOverides<
        React.HTMLProps<HTMLDomTags[Key]>, CSSProperties, ExternalProps, DefaultProps
    >
}

export interface SVGTagGlamorousComponentFactory<Key extends keyof SVGDomTags>  {
    <ExternalProps, Context = object, DefaultProps extends object = object>(
        component: Key,
        options?: Partial<GlamorousOptions<ExternalProps, Context, DefaultProps>>,
    ): KeyGlamorousComponentFactory<
        React.SVGAttributes<SVGDomTags[Key]>, SVGProperties, ExternalProps, DefaultProps
    >

    <ExternalProps, Context = object, DefaultProps extends object = object>(
        component: Key,
        options?: PropsAreCssOverridesGlamorousOptions<ExternalProps, Context, DefaultProps>,
    ): KeyGlamorousComponentFactoryCssOverides<
        React.SVGAttributes<SVGDomTags[Key]>, SVGProperties, ExternalProps, DefaultProps
    >
}

export interface DOMTagComponentFactory extends
    DOMTagGlamorousComponentFactory<'a'>,
    DOMTagGlamorousComponentFactory<'a'>,
    DOMTagGlamorousComponentFactory<'abbr'>,
    DOMTagGlamorousComponentFactory<'address'>,
    DOMTagGlamorousComponentFactory<'area'>,
    DOMTagGlamorousComponentFactory<'article'>,
    DOMTagGlamorousComponentFactory<'aside'>,
    DOMTagGlamorousComponentFactory<'audio'>,
    DOMTagGlamorousComponentFactory<'b'>,
    DOMTagGlamorousComponentFactory<'base'>,
    DOMTagGlamorousComponentFactory<'bdi'>,
    DOMTagGlamorousComponentFactory<'bdo'>,
    DOMTagGlamorousComponentFactory<'big'>,
    DOMTagGlamorousComponentFactory<'blockquote'>,
    DOMTagGlamorousComponentFactory<'body'>,
    DOMTagGlamorousComponentFactory<'br'>,
    DOMTagGlamorousComponentFactory<'button'>,
    DOMTagGlamorousComponentFactory<'canvas'>,
    DOMTagGlamorousComponentFactory<'caption'>,
    DOMTagGlamorousComponentFactory<'cite'>,
    DOMTagGlamorousComponentFactory<'code'>,
    DOMTagGlamorousComponentFactory<'col'>,
    DOMTagGlamorousComponentFactory<'colgroup'>,
    DOMTagGlamorousComponentFactory<'data'>,
    DOMTagGlamorousComponentFactory<'datalist'>,
    DOMTagGlamorousComponentFactory<'dd'>,
    DOMTagGlamorousComponentFactory<'del'>,
    DOMTagGlamorousComponentFactory<'details'>,
    DOMTagGlamorousComponentFactory<'dfn'>,
    DOMTagGlamorousComponentFactory<'dialog'>,
    DOMTagGlamorousComponentFactory<'div'>,
    DOMTagGlamorousComponentFactory<'dl'>,
    DOMTagGlamorousComponentFactory<'dt'>,
    DOMTagGlamorousComponentFactory<'em'>,
    DOMTagGlamorousComponentFactory<'embed'>,
    DOMTagGlamorousComponentFactory<'fieldset'>,
    DOMTagGlamorousComponentFactory<'figcaption'>,
    DOMTagGlamorousComponentFactory<'figure'>,
    DOMTagGlamorousComponentFactory<'footer'>,
    DOMTagGlamorousComponentFactory<'form'>,
    DOMTagGlamorousComponentFactory<'h1'>,
    DOMTagGlamorousComponentFactory<'h2'>,
    DOMTagGlamorousComponentFactory<'h3'>,
    DOMTagGlamorousComponentFactory<'h4'>,
    DOMTagGlamorousComponentFactory<'h5'>,
    DOMTagGlamorousComponentFactory<'h6'>,
    DOMTagGlamorousComponentFactory<'head'>,
    DOMTagGlamorousComponentFactory<'header'>,
    DOMTagGlamorousComponentFactory<'hgroup'>,
    DOMTagGlamorousComponentFactory<'hr'>,
    DOMTagGlamorousComponentFactory<'html'>,
    DOMTagGlamorousComponentFactory<'i'>,
    DOMTagGlamorousComponentFactory<'iframe'>,
    DOMTagGlamorousComponentFactory<'img'>,
    DOMTagGlamorousComponentFactory<'input'>,
    DOMTagGlamorousComponentFactory<'ins'>,
    DOMTagGlamorousComponentFactory<'kbd'>,
    DOMTagGlamorousComponentFactory<'keygen'>,
    DOMTagGlamorousComponentFactory<'label'>,
    DOMTagGlamorousComponentFactory<'legend'>,
    DOMTagGlamorousComponentFactory<'li'>,
    DOMTagGlamorousComponentFactory<'link'>,
    DOMTagGlamorousComponentFactory<'main'>,
    DOMTagGlamorousComponentFactory<'map'>,
    DOMTagGlamorousComponentFactory<'mark'>,
    DOMTagGlamorousComponentFactory<'menu'>,
    DOMTagGlamorousComponentFactory<'menuitem'>,
    DOMTagGlamorousComponentFactory<'meta'>,
    DOMTagGlamorousComponentFactory<'meter'>,
    DOMTagGlamorousComponentFactory<'nav'>,
    DOMTagGlamorousComponentFactory<'noscript'>,
    DOMTagGlamorousComponentFactory<'object'>,
    DOMTagGlamorousComponentFactory<'ol'>,
    DOMTagGlamorousComponentFactory<'optgroup'>,
    DOMTagGlamorousComponentFactory<'option'>,
    DOMTagGlamorousComponentFactory<'output'>,
    DOMTagGlamorousComponentFactory<'p'>,
    DOMTagGlamorousComponentFactory<'param'>,
    DOMTagGlamorousComponentFactory<'picture'>,
    DOMTagGlamorousComponentFactory<'pre'>,
    DOMTagGlamorousComponentFactory<'progress'>,
    DOMTagGlamorousComponentFactory<'q'>,
    DOMTagGlamorousComponentFactory<'rp'>,
    DOMTagGlamorousComponentFactory<'rt'>,
    DOMTagGlamorousComponentFactory<'ruby'>,
    DOMTagGlamorousComponentFactory<'s'>,
    DOMTagGlamorousComponentFactory<'samp'>,
    DOMTagGlamorousComponentFactory<'script'>,
    DOMTagGlamorousComponentFactory<'section'>,
    DOMTagGlamorousComponentFactory<'select'>,
    DOMTagGlamorousComponentFactory<'small'>,
    DOMTagGlamorousComponentFactory<'source'>,
    DOMTagGlamorousComponentFactory<'span'>,
    DOMTagGlamorousComponentFactory<'strong'>,
    DOMTagGlamorousComponentFactory<'style'>,
    DOMTagGlamorousComponentFactory<'sub'>,
    DOMTagGlamorousComponentFactory<'summary'>,
    DOMTagGlamorousComponentFactory<'sup'>,
    DOMTagGlamorousComponentFactory<'table'>,
    DOMTagGlamorousComponentFactory<'tbody'>,
    DOMTagGlamorousComponentFactory<'td'>,
    DOMTagGlamorousComponentFactory<'textarea'>,
    DOMTagGlamorousComponentFactory<'tfoot'>,
    DOMTagGlamorousComponentFactory<'th'>,
    DOMTagGlamorousComponentFactory<'thead'>,
    DOMTagGlamorousComponentFactory<'time'>,
    DOMTagGlamorousComponentFactory<'title'>,
    DOMTagGlamorousComponentFactory<'tr'>,
    DOMTagGlamorousComponentFactory<'track'>,
    DOMTagGlamorousComponentFactory<'u'>,
    DOMTagGlamorousComponentFactory<'ul'>,
    DOMTagGlamorousComponentFactory<'var'>,
    DOMTagGlamorousComponentFactory<'video'>,
    DOMTagGlamorousComponentFactory<'wbr'>
        {}

export interface SVGTagComponentFactory extends
    SVGTagGlamorousComponentFactory<'circle'>,
    SVGTagGlamorousComponentFactory<'clipPath'>,
    SVGTagGlamorousComponentFactory<'defs'>,
    SVGTagGlamorousComponentFactory<'ellipse'>,
    SVGTagGlamorousComponentFactory<'g'>,
    SVGTagGlamorousComponentFactory<'image'>,
    SVGTagGlamorousComponentFactory<'line'>,
    SVGTagGlamorousComponentFactory<'linearGradient'>,
    SVGTagGlamorousComponentFactory<'mask'>,
    SVGTagGlamorousComponentFactory<'path'>,
    SVGTagGlamorousComponentFactory<'pattern'>,
    SVGTagGlamorousComponentFactory<'polygon'>,
    SVGTagGlamorousComponentFactory<'polyline'>,
    SVGTagGlamorousComponentFactory<'radialGradient'>,
    SVGTagGlamorousComponentFactory<'rect'>,
    SVGTagGlamorousComponentFactory<'stop'>,
    SVGTagGlamorousComponentFactory<'svg'>,
    SVGTagGlamorousComponentFactory<'text'>,
    SVGTagGlamorousComponentFactory<'tspan'>
        {}



export interface HTMLDomTags {
    a: HTMLAnchorElement
    abbr: HTMLElement
    address: HTMLElement
    area: HTMLAreaElement
    article: HTMLElement
    aside: HTMLElement
    audio: HTMLAudioElement
    b: HTMLElement
    base: HTMLBaseElement
    bdi: HTMLElement
    bdo: HTMLElement
    big: HTMLElement
    blockquote: HTMLElement
    body: HTMLBodyElement
    br: HTMLBRElement
    button: HTMLButtonElement
    canvas: HTMLCanvasElement
    caption: HTMLElement
    cite: HTMLElement
    code: HTMLElement
    col: HTMLTableColElement
    colgroup: HTMLTableColElement
    data: HTMLElement
    datalist: HTMLDataListElement
    dd: HTMLElement
    del: HTMLElement
    details: HTMLElement
    dfn: HTMLElement
    dialog: HTMLElement
    div: HTMLDivElement
    dl: HTMLDListElement
    dt: HTMLElement
    em: HTMLElement
    embed: HTMLEmbedElement
    fieldset: HTMLFieldSetElement
    figcaption: HTMLElement
    figure: HTMLElement
    footer: HTMLElement
    form: HTMLFormElement
    h1: HTMLHeadingElement
    h2: HTMLHeadingElement
    h3: HTMLHeadingElement
    h4: HTMLHeadingElement
    h5: HTMLHeadingElement
    h6: HTMLHeadingElement
    head: HTMLHeadElement
    header: HTMLElement
    hgroup: HTMLElement
    hr: HTMLHRElement
    html: HTMLHtmlElement
    i: HTMLElement
    iframe: HTMLIFrameElement
    img: HTMLImageElement
    input: HTMLInputElement
    ins: HTMLModElement
    kbd: HTMLElement
    keygen: HTMLElement
    label: HTMLLabelElement
    legend: HTMLLegendElement
    li: HTMLLIElement
    link: HTMLLinkElement
    main: HTMLElement
    map: HTMLMapElement
    mark: HTMLElement
    menu: HTMLElement
    menuitem: HTMLElement
    meta: HTMLMetaElement
    meter: HTMLElement
    nav: HTMLElement
    noscript: HTMLElement
    object: HTMLObjectElement
    ol: HTMLOListElement
    optgroup: HTMLOptGroupElement
    option: HTMLOptionElement
    output: HTMLElement
    p: HTMLParagraphElement
    param: HTMLParamElement
    picture: HTMLElement
    pre: HTMLPreElement
    progress: HTMLProgressElement
    q: HTMLQuoteElement
    rp: HTMLElement
    rt: HTMLElement
    ruby: HTMLElement
    s: HTMLElement
    samp: HTMLElement
    script: HTMLElement
    section: HTMLElement
    select: HTMLSelectElement
    small: HTMLElement
    source: HTMLSourceElement
    span: HTMLSpanElement
    strong: HTMLElement
    style: HTMLStyleElement
    sub: HTMLElement
    summary: HTMLElement
    sup: HTMLElement
    table: HTMLTableElement
    tbody: HTMLTableSectionElement
    td: HTMLTableDataCellElement
    textarea: HTMLTextAreaElement
    tfoot: HTMLTableSectionElement
    th: HTMLTableHeaderCellElement
    thead: HTMLTableSectionElement
    time: HTMLElement
    title: HTMLTitleElement
    tr: HTMLTableRowElement
    track: HTMLTrackElement
    u: HTMLElement
    ul: HTMLUListElement
    var: HTMLElement
    video: HTMLVideoElement
    wbr: HTMLElement
}

export interface SVGDomTags {
    circle: SVGCircleElement
    clipPath: SVGClipPathElement
    defs: SVGDefsElement
    ellipse: SVGEllipseElement
    g: SVGGElement
    image: SVGImageElement
    line: SVGLineElement
    linearGradient: SVGLinearGradientElement
    mask: SVGMaskElement
    path: SVGPathElement
    pattern: SVGPatternElement
    polygon: SVGPolygonElement
    polyline: SVGPolylineElement
    radialGradient: SVGRadialGradientElement
    rect: SVGRectElement
    stop: SVGStopElement
    svg: SVGSVGElement
    text: SVGTextElement
    tspan: SVGTSpanElement
}
        