-- 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;

-- =====================================================
-- 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;

-- =====================================================
-- 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 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');
