interface Sites {
    [key: string]: Site
}

interface Site {
    path: string
    showTeaser: boolean
    teaserImages?: TeaserImage[]
    teaserTitle?: string
    teaserDescription?: string
    row: Row[]
    banner: Banner[]
    id: string
    title: string
    aktiv: boolean
    teaser: {
        showTeaser: boolean
        subTitle: string
        teaserTitle: string
        teaserDescription: string
    }
    meta: {
        autor?: string
        datum?: string
        titel?: string
        beschreibung?: string
        keywords?: string
    }
}

interface Row {
    title: string
    maxWidth: boolean
    column: Column[]
    noGap: boolean
    iconBackgroundTitle: boolean
}

interface IconInfoBoard {
    title: string
    icon: FileField
    text: string
}

interface Column {
    contentType:
        | "mainPicture"
        | "googleMaps"
        | "imageSlider"
        | "table"
        | "infoBoard"
        | "iconBoard"
        | "form"
        | "image"
        | "text"
        | "iconInfoBoard"
        | "boxlist"
        | "productPreview"

    showGoogleMaps?: boolean
    video: FileField
    titleVideo: string
    descriptionVideo: string
    mainPicture?: FileField
    imageSlider: ImageSlider[]
    siteRefs: boolean
    siteReference: boolean
    hintsTable: string
    inscription?: string
    textFieldHeading?: string
    textContent?: string
    annotation?: string
    table?: Table[]
    image?: FileField
    title?: string
    text?: string
    links?: Link[]
    iconBoard?: IconBoard[]
    iconInfoBoard?: IconInfoBoard
    backgroundImage?: FileField
    videoSwitch?: VideoSwitch[]
    formRows?: FormRow[]
    iconBackgroundImage?: boolean
    tableFieldHeading?: string
    boxList: {
        boxes: { name: string }[]
    }
    productPreview: {
        image: FileField
        title: string
        text: string
        price: string
    }[]
}

interface ImageSlider {
    image: FileField
}

interface Link {
    name: string
    site: string
}

interface Table {
    title: string
    tableRow: TableRow[]
    hintsTable: string
}

interface TableRow {
    bold: boolean
    left: string
    right: string
    center: string
}

interface IconBoard {
    icon: FileField
    subText: string
}

interface VideoSwitch {
    video: FileField
    title: string
    description: string
    link: string
}

interface FormRow {
    title?: string
    rowName: string
    columns: FormColumn[]
}

interface Block {
    label: string
    emailName: string
}

interface LabelNumber {
    group: number
    title: string
    emailName: string
    block: Block[]
}

interface FormColumn {
    showLabelNumber: boolean
    labelNumber: LabelNumber[]
    showTimes?: boolean
    annotation: string
    times?: Time[]
    timesPlaceholder?: string
    showDate?: boolean
    showSelect?: boolean
    selectPlaceholder: string
    selectEntries: Entries[]
    datePlaceholder?: string
    datefieldOrder?: number
    textfieldOrder?: number
    timesfieldOrder?: number
    text?: TextField[]
    title: string
    selectTitle: string
    numberPlaceholder: string
    showNumber: boolean
    timeNotRequired: boolean
    dateNotRequired: boolean
    dateSelectNotRequired: boolean
    numberNotRequired: boolean
    emailNameDate: string
    emailNameNumber: string
    emailNameTime: string
    emailNameTimes: string
    numberfieldOrder?: number
}
interface CustomHTMLElement extends HTMLElement {
    checked?: boolean
    value?: any
    required?: boolean
    getAttribute(attr: string): string | null
}

interface FormValues {
    [key: string]: CustomHTMLElement
    blockGroups?: Set<number>
}

interface Temperature {
    temperature: number
}

interface Time {
    timeFrom: string
    timeTo: string
}

interface Entries {
    leftSide: string
    rightSide: string
}

interface TextField {
    textPlaceholder: string
    textArea: boolean
    notRequired: boolean
    telValidation: boolean
    emailValidation: boolean
    dateSelectNotRequired: boolean
    emailName: string
    textfieldOrder: string
}

interface TeaserImage {
    image: FileField
}

interface Banner {
    content: string
}

interface Navigation {
    tree: number
    id: string
    elemente: NavElement[]
}

interface NavElement {
    endpoint: boolean
    name: string
    image: FileField
    seite?: string
    elemente?: NavElement[]
}

interface FileField {
    path: string
    src: string
    type: string
}