-- OpenImmo Database Schema
-- Vollständig konform mit OpenImmo Standard 1.2.7
-- https://www.openimmo.de

SET CHARACTER SET utf8mb4;

-- =====================================================
-- ÜBERTRAGUNG (Transfer Metadata)
-- =====================================================
CREATE TABLE IF NOT EXISTS uebertragung (
    id INT AUTO_INCREMENT PRIMARY KEY,
    art ENUM('ONLINE', 'OFFLINE') DEFAULT 'OFFLINE',
    umfang ENUM('VOLL', 'TEIL') DEFAULT 'VOLL',
    version VARCHAR(20) DEFAULT '1.2.7',
    sendersoftware VARCHAR(100),
    senderversion VARCHAR(50),
    techn_email VARCHAR(255),
    timestamp DATETIME,
    modus ENUM('NEW', 'CHANGE', 'DELETE') DEFAULT 'NEW',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- ANBIETER (Provider/Company)
-- =====================================================
CREATE TABLE IF NOT EXISTS anbieter (
    id INT AUTO_INCREMENT PRIMARY KEY,
    firma VARCHAR(255) NOT NULL,
    openimmo_anid VARCHAR(100) UNIQUE,
    lizenzkennung VARCHAR(100),
    -- Impressum
    impressum_firma VARCHAR(255),
    impressum_strasse VARCHAR(255),
    impressum_plz VARCHAR(20),
    impressum_ort VARCHAR(100),
    impressum_land VARCHAR(10) DEFAULT 'AUT',
    impressum_telefon VARCHAR(50),
    impressum_email VARCHAR(255),
    impressum_website VARCHAR(500),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- PROJEKTE (Projects - Custom extension)
-- =====================================================
CREATE TABLE IF NOT EXISTS projekte (
    id INT AUTO_INCREMENT PRIMARY KEY,
    anbieter_id INT,
    name VARCHAR(255) NOT NULL,
    slug VARCHAR(255) UNIQUE,
    beschreibung TEXT,
    strasse VARCHAR(255),
    plz VARCHAR(20),
    ort VARCHAR(100),
    bundesland VARCHAR(100),
    land VARCHAR(10) DEFAULT 'AUT',
    breitengrad DECIMAL(10, 8),
    laengengrad DECIMAL(11, 8),
    titelbild VARCHAR(500),
    navigator_image VARCHAR(500),
    status ENUM('planung', 'bau', 'fertig', 'archiv') DEFAULT 'planung',
    is_active BOOLEAN DEFAULT TRUE,
    sort_order INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (anbieter_id) REFERENCES anbieter(id) ON DELETE SET NULL,
    INDEX idx_slug (slug),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- GEBÄUDE (Buildings within Projects)
-- =====================================================
CREATE TABLE IF NOT EXISTS gebaeude (
    id INT AUTO_INCREMENT PRIMARY KEY,
    projekt_id INT NOT NULL,
    name VARCHAR(255) NOT NULL,
    beschreibung TEXT,
    navigator_image VARCHAR(500),
    sort_order INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (projekt_id) REFERENCES projekte(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- ETAGEN (Floors within Buildings)
-- =====================================================
CREATE TABLE IF NOT EXISTS etagen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    gebaeude_id INT NOT NULL,
    name VARCHAR(100) NOT NULL,
    etage_nr INT,
    navigator_image VARCHAR(500),
    sort_order INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (gebaeude_id) REFERENCES gebaeude(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- IMMOBILIEN (Properties - OpenImmo <immobilie>)
-- =====================================================
CREATE TABLE IF NOT EXISTS immobilien (
    id INT AUTO_INCREMENT PRIMARY KEY,
    projekt_id INT,
    gebaeude_id INT,
    etage_id INT,

    -- ================== VERWALTUNG_TECHN ==================
    openimmo_obid VARCHAR(100) UNIQUE,
    objektnr_intern VARCHAR(100),
    objektnr_extern VARCHAR(100),
    aktion ENUM('NEW', 'CHANGE', 'DELETE') DEFAULT 'NEW',
    aktiv_von DATE,
    aktiv_bis DATE,
    stand_vom DATE,
    kennzeichen_auftrag_erledigt BOOLEAN DEFAULT FALSE,
    kennzeichen_vermittelt_an_eigentuemer BOOLEAN DEFAULT FALSE,

    -- ================== OBJEKTKATEGORIE ==================
    -- <nutzungsart>
    nutzungsart_wohnen BOOLEAN DEFAULT FALSE,
    nutzungsart_gewerbe BOOLEAN DEFAULT FALSE,
    nutzungsart_anlage BOOLEAN DEFAULT FALSE,
    nutzungsart_waz BOOLEAN DEFAULT FALSE,

    -- <vermarktungsart>
    vermarktungsart_kauf BOOLEAN DEFAULT FALSE,
    vermarktungsart_miete_pacht BOOLEAN DEFAULT FALSE,
    vermarktungsart_erbpacht BOOLEAN DEFAULT FALSE,
    vermarktungsart_leasing BOOLEAN DEFAULT FALSE,

    -- <objektart>
    objektart VARCHAR(100),
    objektart_zusatz VARCHAR(255),

    -- Wohnung Typen
    wohnungtyp ENUM(
        'KEINE_ANGABE', 'DACHGESCHOSS', 'MAISONETTE', 'LOFT-STUDIO-ATELIER',
        'PENTHOUSE', 'TERRASSEN', 'ETAGE', 'ERDGESCHOSS', 'SOUTERRAIN',
        'APARTMENT', 'FERIENWOHNUNG', 'GALERIE', 'ROHDACHBODEN', 'ATTIKAWOHNUNG'
    ),

    -- Haus Typen
    haustyp ENUM(
        'KEINE_ANGABE', 'REIHENHAUS', 'REIHENEND', 'REIHENMITTEL', 'REIHENECK',
        'DOPPELHAUSHAELFTE', 'EINFAMILIENHAUS', 'STADTHAUS', 'BUNGALOW',
        'VILLA', 'RESTHOF', 'BAUERNHAUS', 'LANDHAUS', 'SCHLOSS', 'ZWEIFAMILIENHAUS',
        'MEHRFAMILIENHAUS', 'FERIENHAUS', 'BERGHUETTE', 'CHALET', 'STRANDHAUS'
    ),

    -- Grundstück Typen
    grundstuecktyp ENUM(
        'KEINE_ANGABE', 'WOHNEN', 'GEWERBE', 'INDUSTRIE', 'LAND_FORSTWIRTSCHAFT',
        'FREIZEIT', 'GEMISCHT', 'SEELIEGENSCHAFT', 'TEILEIGENSCHAFT', 'SONDERNUTZUNG'
    ),

    -- Büro Typen
    buero_typ ENUM(
        'KEINE_ANGABE', 'BUEROFLAECHE', 'BUEROHAUS', 'BUEROZENTRUM',
        'LOFT_ATELIER', 'PRAXIS', 'PRAXISFLAECHE', 'PRAXISHAUS',
        'AUSSTELLUNGSFLAECHE', 'COWORKING'
    ),

    -- Handel Typen
    handel_typ ENUM(
        'KEINE_ANGABE', 'LADENLOKAL', 'EINZELHANDELSLADEN', 'VERBRAUCHERMARKT',
        'EINKAUFSZENTRUM', 'KAUFHAUS', 'FACTORY_OUTLET', 'KIOSK', 'VERKAUFSFLAECHE'
    ),

    -- Gastgewerbe Typen
    gastgewerbe_typ ENUM(
        'KEINE_ANGABE', 'GASTRONOMIE', 'RESTAURANT', 'BAR', 'CAFE',
        'DISKOTHEK', 'HOTEL', 'PENSION', 'HOTEL_GARNI'
    ),

    -- Hallen/Lager Typen
    hallen_typ ENUM(
        'KEINE_ANGABE', 'HALLE', 'INDUSTRIEHALLE', 'LAGER', 'LAGERFLAECHE',
        'HOCHREGAL', 'SPEDITIONSLAGER', 'KUEHLHAUS'
    ),

    -- Parken Typen
    parken_typ ENUM(
        'KEINE_ANGABE', 'STELLPLATZ', 'CARPORT', 'DOPPELGARAGE', 'DUPLEX',
        'TIEFGARAGE', 'BOOTSLIEGEPLATZ', 'EINZELGARAGE', 'PARKHAUS',
        'TIEFGARAGENSTELLPLATZ', 'PARKPLATZ_STROM'
    ),

    -- Sonstige Typen
    sonstige_typ ENUM(
        'KEINE_ANGABE', 'PARKHAUS', 'TANKSTELLE', 'KRANKENHAUS',
        'SONSTIGE'
    ),

    -- ================== GEO ==================
    plz VARCHAR(20),
    ort VARCHAR(100),
    strasse VARCHAR(255),
    hausnummer VARCHAR(20),
    bundesland VARCHAR(100),
    land_iso VARCHAR(10) DEFAULT 'AUT',
    breitengrad DECIMAL(10, 8),
    laengengrad DECIMAL(11, 8),
    etage VARCHAR(50),
    wohnungsnr VARCHAR(50),
    lage_im_bau ENUM('LINKS', 'RECHTS', 'MITTE', 'VORNE', 'HINTEN'),
    lage_gebiet ENUM(
        'WOHN', 'GEWERBE', 'INDUSTRIE', 'MISCH', 'NEUBAU', 'ORTSLAGE',
        'SIEDLUNG', 'STADTRAND', 'STADTTEIL', 'STADTZENTRUM', 'NEBENZENTRUM',
        'GEHOEFT', 'AUTOBAHN', 'GRUENLAGE', 'RUHELAGE'
    ),
    regionaler_zusatz VARCHAR(255),
    karten_makro BOOLEAN DEFAULT FALSE,
    karten_mikro BOOLEAN DEFAULT FALSE,
    virtuelle_tour VARCHAR(500),
    luftbild_datei VARCHAR(500),

    -- ================== KONTAKTPERSON ==================
    -- (Separate Tabelle: kontaktpersonen)

    -- ================== PREISE ==================
    kaufpreis DECIMAL(15, 2),
    kaufpreis_netto DECIMAL(15, 2),
    kaufpreis_brutto DECIMAL(15, 2),
    kaufpreis_pro_qm DECIMAL(10, 2),
    kaltmiete DECIMAL(10, 2),
    warmmiete DECIMAL(10, 2),
    nettokaltmiete DECIMAL(10, 2),
    nebenkosten DECIMAL(10, 2),
    heizkosten DECIMAL(10, 2),
    heizkosten_enthalten BOOLEAN DEFAULT FALSE,
    zzg_mehrwertsteuer BOOLEAN DEFAULT FALSE,
    mietzuschlaege DECIMAL(10, 2),
    pauschalmiete DECIMAL(10, 2),
    hauptmietzins DECIMAL(10, 2),
    betriebskosten DECIMAL(10, 2),
    evb_kosten DECIMAL(10, 2),
    gesamtbelastung DECIMAL(10, 2),
    gesamtmiete_brutto DECIMAL(10, 2),
    gesamtmiete_ust DECIMAL(10, 2),
    monatliche_kosten DECIMAL(10, 2),
    kaution DECIMAL(12, 2),
    kaution_text VARCHAR(255),
    geschaeftsguthaben DECIMAL(12, 2),
    richtpreis DECIMAL(15, 2),
    richtpreis_pro_qm DECIMAL(10, 2),
    miete_pro_qm DECIMAL(10, 2),
    provision_aussen DECIMAL(10, 2),
    provision_innen DECIMAL(10, 2),
    provision_aussen_text VARCHAR(255),
    provision_innen_text VARCHAR(255),
    provision_teilen BOOLEAN DEFAULT FALSE,
    provision_pflicht BOOLEAN DEFAULT FALSE,
    waehrung VARCHAR(10) DEFAULT 'EUR',
    mwst_satz DECIMAL(5, 2) DEFAULT 20.00,
    mwst_gesamt DECIMAL(10, 2),
    freitext_preis TEXT,
    x_fache VARCHAR(50),
    nettorendite DECIMAL(6, 3),
    nettorendite_soll DECIMAL(6, 3),
    nettorendite_ist DECIMAL(6, 3),
    mieteinnahmen_ist DECIMAL(12, 2),
    mieteinnahmen_soll DECIMAL(12, 2),
    erschliessungskosten DECIMAL(12, 2),
    stp_carport DECIMAL(10, 2),
    stp_duplex DECIMAL(10, 2),
    stp_freiplatz DECIMAL(10, 2),
    stp_garage DECIMAL(10, 2),
    stp_parkhaus DECIMAL(10, 2),
    stp_tiefgarage DECIMAL(10, 2),
    stp_sonstige DECIMAL(10, 2),

    -- ================== FLAECHEN ==================
    wohnflaeche DECIMAL(10, 2),
    nutzflaeche DECIMAL(10, 2),
    gesamtflaeche DECIMAL(10, 2),
    ladenflaeche DECIMAL(10, 2),
    lagerflaeche DECIMAL(10, 2),
    verkaufsflaeche DECIMAL(10, 2),
    freiflaeche DECIMAL(10, 2),
    bueroflaeche DECIMAL(10, 2),
    bueroteilflaeche DECIMAL(10, 2),
    fensterfront DECIMAL(10, 2),
    verwaltungsflaeche DECIMAL(10, 2),
    gastroflaeche DECIMAL(10, 2),
    grz VARCHAR(20),
    gfz VARCHAR(20),
    bmz VARCHAR(20),
    bgf DECIMAL(10, 2),
    grundstuecksflaeche DECIMAL(10, 2),
    sonstflaeche DECIMAL(10, 2),
    balkon_terrasse_flaeche DECIMAL(10, 2),
    gartenflaeche DECIMAL(10, 2),
    kellerflaeche DECIMAL(10, 2),
    dachbodenflaeche DECIMAL(10, 2),
    fensterfrontqm DECIMAL(10, 2),
    beheizbare_flaeche DECIMAL(10, 2),
    anzahl_zimmer DECIMAL(4, 1),
    anzahl_schlafzimmer INT,
    anzahl_badezimmer INT,
    anzahl_sep_wc INT,
    anzahl_balkone INT,
    anzahl_terrassen INT,
    anzahl_loggien INT,
    balkon_terrasse_ausrichtung VARCHAR(50),
    anzahl_wohn_schlafzimmer INT,
    anzahl_gewerbeeinheiten INT,
    anzahl_wohneinheiten INT,
    einliegerwohnung BOOLEAN DEFAULT FALSE,
    kubatur DECIMAL(10, 2),
    ausnuetzungsziffer DECIMAL(6, 3),
    flaechevon DECIMAL(10, 2),
    flaechebis DECIMAL(10, 2),

    -- ================== AUSSTATTUNG ==================
    -- Bad
    bad_dusche BOOLEAN DEFAULT FALSE,
    bad_wanne BOOLEAN DEFAULT FALSE,
    bad_fenster BOOLEAN DEFAULT FALSE,
    bad_bidet BOOLEAN DEFAULT FALSE,
    bad_pissoir BOOLEAN DEFAULT FALSE,

    -- Küche
    kueche_ebk BOOLEAN DEFAULT FALSE,
    kueche_offen BOOLEAN DEFAULT FALSE,
    kueche_pantry BOOLEAN DEFAULT FALSE,

    -- Boden
    boden_fliesen BOOLEAN DEFAULT FALSE,
    boden_stein BOOLEAN DEFAULT FALSE,
    boden_teppich BOOLEAN DEFAULT FALSE,
    boden_parkett BOOLEAN DEFAULT FALSE,
    boden_fertigparkett BOOLEAN DEFAULT FALSE,
    boden_laminat BOOLEAN DEFAULT FALSE,
    boden_dielen BOOLEAN DEFAULT FALSE,
    boden_kunststoff BOOLEAN DEFAULT FALSE,
    boden_estrich BOOLEAN DEFAULT FALSE,
    boden_doppelboden BOOLEAN DEFAULT FALSE,
    boden_linoleum BOOLEAN DEFAULT FALSE,
    boden_marmor BOOLEAN DEFAULT FALSE,
    boden_terrakotta BOOLEAN DEFAULT FALSE,
    boden_granit BOOLEAN DEFAULT FALSE,

    -- Heizungsart
    heizungsart_etage BOOLEAN DEFAULT FALSE,
    heizungsart_zentral BOOLEAN DEFAULT FALSE,
    heizungsart_fern BOOLEAN DEFAULT FALSE,
    heizungsart_fussboden BOOLEAN DEFAULT FALSE,
    heizungsart_ofen BOOLEAN DEFAULT FALSE,

    -- Befeuerung
    befeuerung_oel BOOLEAN DEFAULT FALSE,
    befeuerung_gas BOOLEAN DEFAULT FALSE,
    befeuerung_elektro BOOLEAN DEFAULT FALSE,
    befeuerung_alternativ BOOLEAN DEFAULT FALSE,
    befeuerung_solar BOOLEAN DEFAULT FALSE,
    befeuerung_erdwaerme BOOLEAN DEFAULT FALSE,
    befeuerung_luftwp BOOLEAN DEFAULT FALSE,
    befeuerung_fern BOOLEAN DEFAULT FALSE,
    befeuerung_block BOOLEAN DEFAULT FALSE,
    befeuerung_wasser_elektro BOOLEAN DEFAULT FALSE,
    befeuerung_pellet BOOLEAN DEFAULT FALSE,
    befeuerung_kohle BOOLEAN DEFAULT FALSE,
    befeuerung_holz BOOLEAN DEFAULT FALSE,
    befeuerung_fluessiggas BOOLEAN DEFAULT FALSE,

    -- Fahrstuhl
    fahrstuhl_personen BOOLEAN DEFAULT FALSE,
    fahrstuhl_lasten BOOLEAN DEFAULT FALSE,

    -- Stellplatz
    stellplatzart ENUM(
        'GARAGE', 'TIEFGARAGE', 'CARPORT', 'FREIPLATZ',
        'PARKHAUS', 'DUPLEX', 'STELLPLATZ'
    ),
    anzahl_stellplaetze INT DEFAULT 0,

    -- Ausstattung Allgemein
    klimatisiert BOOLEAN DEFAULT FALSE,
    gartennutzung BOOLEAN DEFAULT FALSE,
    garten_mitbenutzung BOOLEAN DEFAULT FALSE,
    moebliert ENUM('NEIN', 'TEIL', 'VOLL') DEFAULT 'NEIN',
    rollstuhlgerecht BOOLEAN DEFAULT FALSE,
    kabel_sat_tv BOOLEAN DEFAULT FALSE,
    dvbt BOOLEAN DEFAULT FALSE,
    barrierefrei BOOLEAN DEFAULT FALSE,
    sauna BOOLEAN DEFAULT FALSE,
    swimmingpool BOOLEAN DEFAULT FALSE,
    wasch_trockenraum BOOLEAN DEFAULT FALSE,
    wintergarten BOOLEAN DEFAULT FALSE,
    wintergarten_beheizt BOOLEAN DEFAULT FALSE,
    dv_verkabelung BOOLEAN DEFAULT FALSE,
    rampe BOOLEAN DEFAULT FALSE,
    hebebuehne BOOLEAN DEFAULT FALSE,
    kran BOOLEAN DEFAULT FALSE,
    gastterrasse BOOLEAN DEFAULT FALSE,
    stromanschluss VARCHAR(50),
    kantine_cafeteria BOOLEAN DEFAULT FALSE,
    teekueche BOOLEAN DEFAULT FALSE,
    hallenhoehe DECIMAL(6, 2),
    angeschl_gastronomie BOOLEAN DEFAULT FALSE,
    brapiflaeche BOOLEAN DEFAULT FALSE,
    sporteinrichtungen BOOLEAN DEFAULT FALSE,
    wellnessbereich BOOLEAN DEFAULT FALSE,
    serviceleistungen TEXT,
    telefon_ferienimmobilie BOOLEAN DEFAULT FALSE,
    breitband_zugang ENUM('DSL', 'ISDN', 'STANDLEITUNG', 'KABEL', 'FUNK', 'GLASFASER'),
    breitband_geschw VARCHAR(50),
    umts_empfang BOOLEAN DEFAULT FALSE,
    sicherheitstechnik_alarmanlage BOOLEAN DEFAULT FALSE,
    sicherheitstechnik_kamera BOOLEAN DEFAULT FALSE,
    unterkellert ENUM('NEIN', 'JA', 'TEIL') DEFAULT 'NEIN',
    abstellraum BOOLEAN DEFAULT FALSE,
    fahrradraum BOOLEAN DEFAULT FALSE,
    rolladen BOOLEAN DEFAULT FALSE,
    bibliothek BOOLEAN DEFAULT FALSE,
    dachform ENUM(
        'FLACHDACH', 'KRUEPPELWALMDACH', 'MANSARDDACH', 'PULTDACH',
        'PYRAMIDENDACH', 'SATTELDACH', 'SCHMETTERLINGSDACH',
        'TONNENDACH', 'WALMDACH', 'ZELTDACH'
    ),
    bauweise ENUM(
        'MASSIV', 'FERTIGTEILE', 'HOLZ'
    ),
    ausbaustufe ENUM(
        'AUSBAUHAUS', 'BAUSATZHAUS', 'SCHLUESSELFERTIG_MIT_BODENBELAG',
        'SCHLUESSELFERTIG_OHNE_BODENBELAG', 'SCHLUESSELFERTIG_MIT_KELLER'
    ),
    energietyp_passivhaus BOOLEAN DEFAULT FALSE,
    energietyp_niedrigenergiehaus BOOLEAN DEFAULT FALSE,
    energietyp_kfw40 BOOLEAN DEFAULT FALSE,
    energietyp_kfw55 BOOLEAN DEFAULT FALSE,
    energietyp_kfw60 BOOLEAN DEFAULT FALSE,
    energietyp_kfw70 BOOLEAN DEFAULT FALSE,
    energietyp_minergie BOOLEAN DEFAULT FALSE,
    energietyp_minergie_zertifiziert BOOLEAN DEFAULT FALSE,

    -- ================== ZUSTAND_ANGABEN ==================
    baujahr INT,
    letztemodernisierung VARCHAR(50),
    zustand ENUM(
        'ERSTBEZUG', 'TEIL_VOLLRENOVIERUNGSBED', 'NEUWERTIG',
        'TEIL_VOLLSANIERT', 'TEIL_VOLLRENOVIERT', 'TEIL_SANIERT',
        'VOLL_SANIERT', 'SANIERUNGSBED', 'BAUFAELLIG', 'ABRISSOBJEKT',
        'MODERNISIERT', 'GEPFLEGT', 'ROHBAU', 'ENTKERNT', 'NACH_VEREINBARUNG'
    ),
    alter_attr ENUM('ALTBAU', 'NEUBAU'),
    bebaubar_nach TEXT,
    erschliessung ENUM('UNERSCHLOSSEN', 'TEILERSCHLOSSEN', 'VOLLERSCHLOSSEN', 'ORTSUEBLICHE_ERSCHLIESSUNG'),
    erschliessung_umfang TEXT,
    bauzone VARCHAR(100),
    altlasten TEXT,
    verkaufstatus ENUM('OFFEN', 'RESERVIERT', 'VERKAUFT'),

    -- ================== ENERGIEPASS ==================
    epass_gueltig_bis DATE,
    epass_hwbwert DECIMAL(8, 2),
    epass_hwbklasse VARCHAR(10),
    epass_fgeewert DECIMAL(8, 4),
    epass_fgeeklasse VARCHAR(10),
    epass_primaerenergietraeger VARCHAR(100),
    epass_stromwert DECIMAL(8, 2),
    epass_waermewert DECIMAL(8, 2),
    epass_wertklasse VARCHAR(10),
    epass_baujahr VARCHAR(10),
    epass_ausstelldatum DATE,
    epass_jahrgang VARCHAR(20),
    epass_gebaeudeart ENUM('WOHN', 'GEWERBE'),
    epass_epart ENUM('VERBRAUCH', 'BEDARF'),
    epass_art VARCHAR(50),
    epass_energieverbrauchkennwert DECIMAL(8, 2),
    epass_mitwarmwasser BOOLEAN DEFAULT FALSE,
    epass_endenergiebedarf DECIMAL(8, 2),

    -- ================== BEWERTUNG ==================
    feld1 VARCHAR(255),
    feld2 VARCHAR(255),
    feld3 VARCHAR(255),

    -- ================== FREITEXTE ==================
    objekttitel VARCHAR(500),
    dreizeiler TEXT,
    lage TEXT,
    ausstatt_beschr TEXT,
    objektbeschreibung TEXT,
    sonstige_angaben TEXT,
    objekt_text TEXT,

    -- ================== VERWALTUNG_OBJEKT ==================
    objektadresse_freigeben BOOLEAN DEFAULT TRUE,
    verfuegbar_ab VARCHAR(100),
    abdatum DATE,
    bisdatum DATE,
    min_mietdauer ENUM('TAG', 'WOCHE', 'MONAT', 'JAHR'),
    min_mietdauer_wert INT,
    max_mietdauer ENUM('TAG', 'WOCHE', 'MONAT', 'JAHR', 'UNBEFRISTET'),
    max_mietdauer_wert INT,
    versteigerungstermin DATETIME,
    wbs_sozialwohnung BOOLEAN DEFAULT FALSE,
    vermietet BOOLEAN DEFAULT FALSE,
    gruppennummer VARCHAR(50),
    zugang VARCHAR(50),
    laufzeit DECIMAL(6, 2),
    max_personen INT,
    nichtraucher BOOLEAN DEFAULT FALSE,
    haustiere BOOLEAN DEFAULT TRUE,
    geschlecht ENUM('EGAL', 'NUR_MANN', 'NUR_FRAU'),
    denkmalgeschuetzt BOOLEAN DEFAULT FALSE,
    als_ferien BOOLEAN DEFAULT FALSE,
    gewerbliche_nutzung BOOLEAN DEFAULT FALSE,
    branchen TEXT,
    hochhaus BOOLEAN DEFAULT FALSE,

    -- ================== IMMOCHECKOUT CUSTOM FIELDS ==================
    immocheckout_status_visible BOOLEAN DEFAULT TRUE,
    immocheckout_status_available BOOLEAN DEFAULT TRUE,
    immocheckout_status_export BOOLEAN DEFAULT TRUE,
    immocheckout_title VARCHAR(255),
    ausrichtung_name VARCHAR(50),
    ausrichtung_typ VARCHAR(50),
    navigator_coordinates JSON,

    -- ================== META ==================
    is_active BOOLEAN DEFAULT TRUE,
    sort_order INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    FOREIGN KEY (projekt_id) REFERENCES projekte(id) ON DELETE SET NULL,
    FOREIGN KEY (gebaeude_id) REFERENCES gebaeude(id) ON DELETE SET NULL,
    FOREIGN KEY (etage_id) REFERENCES etagen(id) ON DELETE SET NULL,
    INDEX idx_projekt (projekt_id),
    INDEX idx_openimmo_obid (openimmo_obid),
    INDEX idx_verfuegbar (immocheckout_status_available, immocheckout_status_visible),
    INDEX idx_objektart (objektart),
    INDEX idx_vermarktung (vermarktungsart_kauf, vermarktungsart_miete_pacht),
    INDEX idx_nutzung (nutzungsart_wohnen, nutzungsart_gewerbe)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- KONTAKTPERSONEN (OpenImmo <kontaktperson>)
-- =====================================================
CREATE TABLE IF NOT EXISTS kontaktpersonen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    immobilie_id INT,
    anbieter_id INT,
    projekt_id INT,
    -- Personendaten
    email_zentrale VARCHAR(255),
    email_direkt VARCHAR(255),
    email_privat VARCHAR(255),
    email_sonstige VARCHAR(255),
    tel_zentrale VARCHAR(50),
    tel_durchw VARCHAR(50),
    tel_fax VARCHAR(50),
    tel_handy VARCHAR(50),
    tel_privat VARCHAR(50),
    tel_sonstige VARCHAR(50),
    name VARCHAR(100),
    vorname VARCHAR(100),
    titel VARCHAR(50),
    anrede ENUM('HERR', 'FRAU', 'DIVERS'),
    anrede_brief VARCHAR(100),
    firma VARCHAR(255),
    zusatzfeld VARCHAR(255),
    strasse VARCHAR(255),
    hausnummer VARCHAR(20),
    plz VARCHAR(20),
    ort VARCHAR(100),
    postfach VARCHAR(50),
    postf_plz VARCHAR(20),
    postf_ort VARCHAR(100),
    land_iso VARCHAR(10) DEFAULT 'AUT',
    email_feedback VARCHAR(255),
    url VARCHAR(500),
    adressfreigabe BOOLEAN DEFAULT TRUE,
    personennummer VARCHAR(50),
    immobilientreuhaenderid VARCHAR(100),
    foto VARCHAR(500),
    freitextfeld TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (immobilie_id) REFERENCES immobilien(id) ON DELETE CASCADE,
    FOREIGN KEY (anbieter_id) REFERENCES anbieter(id) ON DELETE SET NULL,
    FOREIGN KEY (projekt_id) REFERENCES projekte(id) ON DELETE CASCADE,
    INDEX idx_immobilie (immobilie_id),
    INDEX idx_projekt (projekt_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- ANHÄNGE/BILDER (OpenImmo <anhang>)
-- =====================================================
CREATE TABLE IF NOT EXISTS anhaenge (
    id INT AUTO_INCREMENT PRIMARY KEY,
    immobilie_id INT,
    projekt_id INT,
    -- Anhang Attribute
    location ENUM('INTERN', 'EXTERN', 'REMOTE') DEFAULT 'EXTERN',
    gruppe ENUM(
        'TITELBILD', 'INNENANSICHTEN', 'AUSSENANSICHTEN', 'GRUNDRISS',
        'KARTEN_LAGEPLAN', 'ANBIETERLOGO', 'BILD', 'DOKUMENTE',
        'LINKS', 'PANORAMA', 'QRCODE', 'FILM', 'FILMLINK', 'EPASS_SKALA'
    ) DEFAULT 'BILD',
    -- Anhang Daten
    anhangtitel VARCHAR(255),
    format VARCHAR(50),
    pfad VARCHAR(500) NOT NULL,
    external_url VARCHAR(500),
    check_datetime DATETIME,
    check_summe VARCHAR(64),
    -- Erweitert
    sort_order INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (immobilie_id) REFERENCES immobilien(id) ON DELETE CASCADE,
    FOREIGN KEY (projekt_id) REFERENCES projekte(id) ON DELETE CASCADE,
    INDEX idx_immobilie (immobilie_id),
    INDEX idx_projekt (projekt_id),
    INDEX idx_gruppe (gruppe)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- WEITERE ANGABEN (OpenImmo <weitere_adresse>)
-- =====================================================
CREATE TABLE IF NOT EXISTS weitere_adressen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    immobilie_id INT NOT NULL,
    adressart ENUM('OBJEKT', 'VERWALTER', 'EIGENTUEMER', 'ENTSORGER', 'HAUSMEISTER', 'ARGE'),
    vorname VARCHAR(100),
    name VARCHAR(100),
    firma VARCHAR(255),
    strasse VARCHAR(255),
    hausnummer VARCHAR(20),
    plz VARCHAR(20),
    ort VARCHAR(100),
    land_iso VARCHAR(10) DEFAULT 'AUT',
    email VARCHAR(255),
    telefon VARCHAR(50),
    fax VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (immobilie_id) REFERENCES immobilien(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- INFRASTRUKTUR (OpenImmo <infrastruktur>)
-- =====================================================
CREATE TABLE IF NOT EXISTS infrastruktur (
    id INT AUTO_INCREMENT PRIMARY KEY,
    immobilie_id INT NOT NULL,
    zulieferung BOOLEAN DEFAULT FALSE,
    ausblick ENUM('BERGE', 'SEE', 'MEER', 'FERNE'),
    distanz_flughafen DECIMAL(10, 2),
    distanz_fernbahnhof DECIMAL(10, 2),
    distanz_autobahn DECIMAL(10, 2),
    distanz_usbahn DECIMAL(10, 2),
    distanz_bus DECIMAL(10, 2),
    distanz_sonstiges DECIMAL(10, 2),
    distanz_einkaufsmoeglichkeiten DECIMAL(10, 2),
    distanz_gaststaetten DECIMAL(10, 2),
    distanz_grundschule DECIMAL(10, 2),
    distanz_hauptschule DECIMAL(10, 2),
    distanz_realschule DECIMAL(10, 2),
    distanz_gymnasium DECIMAL(10, 2),
    distanz_zentrum DECIMAL(10, 2),
    distanz_kindergarten DECIMAL(10, 2),
    distanz_gewerbegebiet DECIMAL(10, 2),
    distanz_gewerbegebiet_km DECIMAL(10, 2),
    FOREIGN KEY (immobilie_id) REFERENCES immobilien(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- ZUBEHÖR (Stellplätze, Keller, etc.)
-- =====================================================
CREATE TABLE IF NOT EXISTS zubehoer (
    id INT AUTO_INCREMENT PRIMARY KEY,
    projekt_id INT,
    immobilie_id INT,
    typ ENUM('STELLPLATZ', 'TIEFGARAGE', 'CARPORT', 'GARAGE', 'KELLER', 'LAGER', 'SONSTIGE') NOT NULL,
    name VARCHAR(255) NOT NULL,
    beschreibung TEXT,
    groesse DECIMAL(10, 2),
    einheit VARCHAR(20) DEFAULT 'm²',
    kaufpreis DECIMAL(12, 2),
    mietpreis DECIMAL(10, 2),
    is_available BOOLEAN DEFAULT TRUE,
    is_active BOOLEAN DEFAULT TRUE,
    sort_order INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (projekt_id) REFERENCES projekte(id) ON DELETE CASCADE,
    FOREIGN KEY (immobilie_id) REFERENCES immobilien(id) ON DELETE SET NULL,
    INDEX idx_projekt (projekt_id),
    INDEX idx_typ (typ)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- ANFRAGEN (OpenImmo Feedback)
-- =====================================================
CREATE TABLE IF NOT EXISTS anfragen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    immobilie_id INT,
    projekt_id INT,
    zubehoer_id INT,

    -- OpenImmo Feedback Fields
    openimmo_anid VARCHAR(100),
    openimmo_obid VARCHAR(100),
    portal_unique_id VARCHAR(100),
    portal_obj_id VARCHAR(100),
    verarbeitung ENUM('NEU', 'GELESEN', 'BEARBEITET', 'ARCHIVIERT') DEFAULT 'NEU',

    -- Interessent Daten
    interessent_anrede ENUM('HERR', 'FRAU', 'DIVERS'),
    interessent_typ ENUM('privat', 'firma') DEFAULT 'privat',
    interessent_titel_vor VARCHAR(50),
    interessent_vorname VARCHAR(100),
    interessent_nachname VARCHAR(100) NOT NULL,
    interessent_titel_nach VARCHAR(100),
    interessent_firma VARCHAR(255),
    interessent_strasse VARCHAR(255),
    interessent_hausnummer VARCHAR(20),
    interessent_plz VARCHAR(20),
    interessent_ort VARCHAR(100),
    interessent_land_iso VARCHAR(10) DEFAULT 'AUT',
    interessent_email VARCHAR(255) NOT NULL,
    interessent_tel_privat VARCHAR(50),
    interessent_tel_buero VARCHAR(50),
    interessent_tel_handy VARCHAR(50),
    interessent_tel_fax VARCHAR(50),
    interessent_bevorzugt ENUM('EMAIL', 'TELEFON', 'FAX', 'POST', 'EGAL') DEFAULT 'EMAIL',
    interessent_wunsch TEXT,

    -- Anfrage Details
    anfrageart ENUM('KAUF', 'MIETE', 'INFO', 'BESICHTIGUNG', 'RUECKRUF', 'SONSTIGE') DEFAULT 'INFO',
    anfragedatum DATETIME,
    budget_von DECIMAL(12, 2),
    budget_bis DECIMAL(12, 2),
    einzug_ab DATE,
    nachricht TEXT,

    -- OpenImmo Feedback XML (komplett)
    feedback_xml TEXT,

    -- Status
    status ENUM('NEU', 'BEARBEITET', 'KONTAKTIERT', 'ABGESCHLOSSEN', 'ABGELEHNT') DEFAULT 'NEU',
    bearbeiter VARCHAR(100),
    bearbeitet_am DATETIME,
    notizen TEXT,

    -- DSGVO
    datenschutz_akzeptiert BOOLEAN DEFAULT FALSE,
    marketing_akzeptiert BOOLEAN DEFAULT FALSE,

    -- Meta
    ip_address VARCHAR(45),
    user_agent TEXT,
    referrer VARCHAR(500),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    FOREIGN KEY (immobilie_id) REFERENCES immobilien(id) ON DELETE SET NULL,
    FOREIGN KEY (projekt_id) REFERENCES projekte(id) ON DELETE SET NULL,
    FOREIGN KEY (zubehoer_id) REFERENCES zubehoer(id) ON DELETE SET NULL,
    INDEX idx_immobilie (immobilie_id),
    INDEX idx_status (status),
    INDEX idx_created (created_at),
    INDEX idx_openimmo (openimmo_anid, openimmo_obid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- IMPORT LOG
-- =====================================================
CREATE TABLE IF NOT EXISTS import_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    filename VARCHAR(255),
    uebertragung_art VARCHAR(20),
    uebertragung_umfang VARCHAR(20),
    sendersoftware VARCHAR(100),
    status ENUM('SUCCESS', 'PARTIAL', 'FAILED') DEFAULT 'SUCCESS',
    total_count INT DEFAULT 0,
    imported_count INT DEFAULT 0,
    updated_count INT DEFAULT 0,
    deleted_count INT DEFAULT 0,
    error_count INT DEFAULT 0,
    errors TEXT,
    import_type ENUM('FULL', 'UPDATE', 'DELETE') DEFAULT 'FULL',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- BENUTZER (Admin Users)
-- =====================================================
CREATE TABLE IF NOT EXISTS benutzer (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    vorname VARCHAR(100),
    nachname VARCHAR(100),
    rolle ENUM('ADMIN', 'EDITOR', 'VIEWER') DEFAULT 'VIEWER',
    is_active BOOLEAN DEFAULT TRUE,
    last_login TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- EINSTELLUNGEN
-- =====================================================
CREATE TABLE IF NOT EXISTS einstellungen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    schluessel VARCHAR(100) UNIQUE NOT NULL,
    wert TEXT,
    beschreibung TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- DEFAULT DATA
-- =====================================================

-- Default Admin User (password: admin123 - SOFORT ÄNDERN!)
INSERT INTO benutzer (username, email, password_hash, vorname, nachname, rolle) VALUES
('admin', 'admin@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Admin', 'User', 'ADMIN');

-- Default Settings
INSERT INTO einstellungen (schluessel, wert, beschreibung) VALUES
('company_name', 'OpenImmo Verwaltung', 'Firmenname'),
('company_email', 'info@example.com', 'Kontakt E-Mail'),
('items_per_page', '20', 'Einträge pro Seite'),
('enable_inquiries', '1', 'Anfragen aktiviert'),
('primary_color', '#1a365d', 'Primärfarbe'),
('openimmo_version', '1.2.7', 'OpenImmo Version');
