-- Antragstracker Hagen — SQLite Schema
-- Schicht 1: ALLRIS-Mirror + Schicht 2: Analyse

PRAGMA journal_mode = WAL;
PRAGMA foreign_keys = ON;

----------------------------------------------------------------------
-- SCHICHT 1: ALLRIS-Mirror
----------------------------------------------------------------------

-- Parteien (Lookup)
CREATE TABLE IF NOT EXISTS parteien (
    id INTEGER PRIMARY KEY,
    kuerzel TEXT UNIQUE NOT NULL,
    name TEXT,
    farbe TEXT
);

INSERT OR IGNORE INTO parteien (kuerzel, name, farbe) VALUES
    ('GRÜNE', 'Bündnis 90/Die Grünen', '#1AA037'),
    ('CDU', 'Christlich Demokratische Union', '#000000'),
    ('SPD', 'Sozialdemokratische Partei Deutschlands', '#E3000F'),
    ('FDP', 'Freie Demokratische Partei', '#FFED00'),
    ('LINKE', 'Die Linke', '#BE3075'),
    ('AfD', 'Alternative für Deutschland', '#009EE0'),
    ('HBL', 'Hagener Bürger-Liste', '#FF8C00'),
    ('BfHo', 'Bürger für Hohenlimburg', '#8B4513'),
    ('Volt', 'Volt Deutschland', '#502379'),
    ('parteilos', 'Parteilos', '#808080');

-- Gremien (Lookup)
CREATE TABLE IF NOT EXISTS gremien (
    id INTEGER PRIMARY KEY,
    oparl_id TEXT UNIQUE,
    name TEXT NOT NULL,
    kuerzel TEXT,
    typ TEXT  -- 'rat', 'ausschuss', 'bv'
);

-- Thematische Klassifikation (Aktenplan)
CREATE TABLE IF NOT EXISTS themen_kategorien (
    id INTEGER PRIMARY KEY,
    code TEXT UNIQUE NOT NULL,
    name TEXT NOT NULL,
    ebene INTEGER,
    parent_code TEXT
);

-- Hauptgruppen (Ebene 1)
INSERT OR IGNORE INTO themen_kategorien (code, name, ebene, parent_code) VALUES
    ('000', 'Allgemeine Verwaltung', 1, NULL),
    ('100', 'Sicherheit und Ordnung', 1, NULL),
    ('200', 'Schulen', 1, NULL),
    ('300', 'Kultur', 1, NULL),
    ('400', 'Soziales', 1, NULL),
    ('500', 'Gesundheit und Sport', 1, NULL),
    ('600', 'Bauwesen', 1, NULL),
    ('700', 'Öffentliche Einrichtungen', 1, NULL),
    ('800', 'Wirtschaft und Verkehr', 1, NULL),
    ('900', 'Finanzen', 1, NULL);

-- Gruppen (Ebene 2)
INSERT OR IGNORE INTO themen_kategorien (code, name, ebene, parent_code) VALUES
    ('001', 'Verfassung, Verwaltungsorganisation', 2, '000'),
    ('002', 'Statistik, Wahlen', 2, '000'),
    ('003', 'Ratsangelegenheiten', 2, '000'),
    ('004', 'Personal', 2, '000'),
    ('005', 'IT, Digitalisierung', 2, '000'),
    ('006', 'Öffentlichkeitsarbeit', 2, '000'),
    ('007', 'Interkommunale Zusammenarbeit', 2, '000'),
    ('008', 'Bürgerservice, Bürgerbeteiligung', 2, '000'),
    ('110', 'Polizeiwesen, öffentliche Sicherheit', 2, '100'),
    ('111', 'Straßenverkehr, Verkehrssicherheit', 2, '100'),
    ('112', 'Gewerbeaufsicht', 2, '100'),
    ('113', 'Feuerschutz, Feuerwehr', 2, '100'),
    ('114', 'Katastrophenschutz, Rettungsdienst', 2, '100'),
    ('115', 'Ordnungsamt, Ordnungswidrigkeiten', 2, '100'),
    ('116', 'Ausländerwesen', 2, '100'),
    ('117', 'Standesamt', 2, '100'),
    ('210', 'Schulverwaltung', 2, '200'),
    ('211', 'Grundschulen', 2, '200'),
    ('212', 'Weiterführende Schulen', 2, '200'),
    ('213', 'Förderschulen', 2, '200'),
    ('214', 'Berufsschulen', 2, '200'),
    ('215', 'Schulentwicklungsplanung', 2, '200'),
    ('216', 'Schülerbeförderung', 2, '200'),
    ('217', 'OGS, Ganztagsbetreuung', 2, '200'),
    ('310', 'Kulturförderung, Kulturpolitik', 2, '300'),
    ('311', 'Museen', 2, '300'),
    ('312', 'Bibliotheken', 2, '300'),
    ('313', 'Theater, Konzerte', 2, '300'),
    ('314', 'Musikschulen', 2, '300'),
    ('315', 'VHS, Erwachsenenbildung', 2, '300'),
    ('316', 'Denkmalschutz', 2, '300'),
    ('317', 'Stadtgeschichte, Archive', 2, '300'),
    ('410', 'Sozialplanung', 2, '400'),
    ('411', 'Jugendhilfe', 2, '400'),
    ('412', 'Kindertagesstätten', 2, '400'),
    ('413', 'Jugendarbeit', 2, '400'),
    ('414', 'Seniorenarbeit', 2, '400'),
    ('415', 'Behindertenhilfe, Inklusion', 2, '400'),
    ('416', 'Integration, Migration', 2, '400'),
    ('417', 'Wohnungslosenhilfe', 2, '400'),
    ('418', 'Sozialleistungen', 2, '400'),
    ('510', 'Gesundheitsförderung', 2, '500'),
    ('511', 'Gesundheitsamt', 2, '500'),
    ('512', 'Krankenhäuser, Kliniken', 2, '500'),
    ('513', 'Suchtprävention', 2, '500'),
    ('520', 'Sport allgemein', 2, '500'),
    ('521', 'Sportförderung', 2, '500'),
    ('522', 'Sportstätten', 2, '500'),
    ('523', 'Vereinsförderung', 2, '500'),
    ('610', 'Stadtplanung, Bauleitplanung', 2, '600'),
    ('611', 'Bebauungspläne', 2, '600'),
    ('612', 'Flächennutzungsplan', 2, '600'),
    ('613', 'Bauordnung', 2, '600'),
    ('614', 'Hochbau, Gebäudemanagement', 2, '600'),
    ('615', 'Tiefbau, Straßenbau', 2, '600'),
    ('616', 'Wohnungsbau, Wohnungsförderung', 2, '600'),
    ('617', 'Grünflächen, Parks', 2, '600'),
    ('618', 'Spielplätze', 2, '600'),
    ('619', 'Klimaschutz, Umwelt', 2, '600'),
    ('710', 'Versorgung, Entsorgung', 2, '700'),
    ('711', 'Wasserversorgung', 2, '700'),
    ('712', 'Abwasser, Kanalisation', 2, '700'),
    ('713', 'Abfallwirtschaft', 2, '700'),
    ('714', 'Friedhöfe', 2, '700'),
    ('715', 'Bäder, Schwimmbäder', 2, '700'),
    ('716', 'Märkte', 2, '700'),
    ('717', 'Stadtwerke', 2, '700'),
    ('810', 'Wirtschaftsförderung', 2, '800'),
    ('811', 'Arbeitsmarkt', 2, '800'),
    ('812', 'Tourismus', 2, '800'),
    ('820', 'Verkehr allgemein', 2, '800'),
    ('821', 'ÖPNV, Nahverkehr', 2, '800'),
    ('822', 'Radverkehr', 2, '800'),
    ('823', 'Fußverkehr', 2, '800'),
    ('824', 'Straßen, Parkraum', 2, '800'),
    ('825', 'Mobilität, Verkehrswende', 2, '800'),
    ('910', 'Haushalt', 2, '900'),
    ('911', 'Steuern, Abgaben', 2, '900'),
    ('912', 'Liegenschaften', 2, '900'),
    ('913', 'Beteiligungen', 2, '900'),
    ('914', 'Fördermittel', 2, '900'),
    ('915', 'Gebühren', 2, '900');

-- Schlagwörter
CREATE TABLE IF NOT EXISTS schlagwoerter (
    id INTEGER PRIMARY KEY,
    name TEXT UNIQUE NOT NULL
);

-- Vorlagen (Kerntabelle)
CREATE TABLE IF NOT EXISTS vorlagen (
    id INTEGER PRIMARY KEY,
    oparl_id TEXT UNIQUE,
    volfdnr INTEGER,
    aktenzeichen TEXT,
    aktenzeichen_basis TEXT,
    aktenzeichen_suffix TEXT,
    typ TEXT,
    betreff TEXT,
    volltext TEXT,
    volltext_clean TEXT,
    datum_eingang DATE,
    pdf_url TEXT,
    web_url TEXT,
    ist_verwaltungsvorlage BOOLEAN DEFAULT FALSE,
    thema_kategorie_id INTEGER REFERENCES themen_kategorien(id),
    thema_kurz TEXT,
    scraped_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_vorlagen_aktenzeichen ON vorlagen(aktenzeichen);
CREATE INDEX IF NOT EXISTS idx_vorlagen_aktenzeichen_basis ON vorlagen(aktenzeichen_basis);
CREATE INDEX IF NOT EXISTS idx_vorlagen_typ ON vorlagen(typ);
CREATE INDEX IF NOT EXISTS idx_vorlagen_datum ON vorlagen(datum_eingang);

-- Verschlagwortung (n:m)
CREATE TABLE IF NOT EXISTS vorlage_schlagwoerter (
    vorlage_id INTEGER REFERENCES vorlagen(id),
    schlagwort_id INTEGER REFERENCES schlagwoerter(id),
    konfidenz REAL DEFAULT 1.0,
    PRIMARY KEY (vorlage_id, schlagwort_id)
);

-- Ortsbezüge
CREATE TABLE IF NOT EXISTS ortsbezuege (
    id INTEGER PRIMARY KEY,
    vorlage_id INTEGER REFERENCES vorlagen(id),
    ortsangabe TEXT NOT NULL,
    ortstyp TEXT,
    strasse1 TEXT,
    strasse2 TEXT,
    hausnummer TEXT,
    stadtteil TEXT,
    lat REAL,
    lon REAL,
    geocoding_quelle TEXT,
    geocoding_konfidenz REAL,
    konfidenz REAL DEFAULT 1.0,
    kontext TEXT,
    ist_antragsgegenstand BOOLEAN DEFAULT TRUE
);

-- Antragsteller (n:m)
CREATE TABLE IF NOT EXISTS antragsteller (
    vorlage_id INTEGER REFERENCES vorlagen(id),
    partei_id INTEGER REFERENCES parteien(id),
    rolle TEXT DEFAULT 'antragsteller',
    PRIMARY KEY (vorlage_id, partei_id)
);

-- Beratungsfolge
CREATE TABLE IF NOT EXISTS beratungen (
    id INTEGER PRIMARY KEY,
    vorlage_id INTEGER REFERENCES vorlagen(id),
    gremium_id INTEGER REFERENCES gremien(id),
    sitzung_datum DATE,
    sitzung_id INTEGER,
    tagesordnungspunkt TEXT,
    rolle TEXT,
    ergebnis TEXT,
    ergebnis_text TEXT,
    protokoll_auszug TEXT
);

CREATE INDEX IF NOT EXISTS idx_beratungen_vorlage ON beratungen(vorlage_id);
CREATE INDEX IF NOT EXISTS idx_beratungen_gremium ON beratungen(gremium_id);

-- Anlagen
CREATE TABLE IF NOT EXISTS anlagen (
    id INTEGER PRIMARY KEY,
    vorlage_id INTEGER REFERENCES vorlagen(id),
    dateiname TEXT,
    url TEXT,
    inhalt_text TEXT,
    braucht_extraktion BOOLEAN DEFAULT FALSE
);

----------------------------------------------------------------------
-- SCHICHT 2: Analyse
----------------------------------------------------------------------

-- Referenzen (Graph-Kanten)
CREATE TABLE IF NOT EXISTS referenzen (
    id INTEGER PRIMARY KEY,
    quelle_id INTEGER REFERENCES vorlagen(id),
    ziel_id INTEGER REFERENCES vorlagen(id),
    typ TEXT NOT NULL,
    konfidenz REAL DEFAULT 1.0,
    kontext TEXT,
    UNIQUE(quelle_id, ziel_id, typ)
);

CREATE INDEX IF NOT EXISTS idx_referenzen_quelle ON referenzen(quelle_id);
CREATE INDEX IF NOT EXISTS idx_referenzen_ziel ON referenzen(ziel_id);

-- Ketten
CREATE TABLE IF NOT EXISTS ketten (
    id INTEGER PRIMARY KEY,
    ursprung_id INTEGER REFERENCES vorlagen(id),
    typ TEXT,
    thema TEXT,
    status TEXT,
    status_seit DATE,
    letzte_aktivitaet DATE,
    vertagungen_count INTEGER DEFAULT 0
);

-- Ketten-Glieder
CREATE TABLE IF NOT EXISTS ketten_glieder (
    kette_id INTEGER REFERENCES ketten(id),
    vorlage_id INTEGER REFERENCES vorlagen(id),
    position INTEGER,
    rolle TEXT,
    PRIMARY KEY (kette_id, vorlage_id)
);

-- KI-Bewertungen
CREATE TABLE IF NOT EXISTS ki_bewertungen (
    id INTEGER PRIMARY KEY,
    vorlage_id INTEGER REFERENCES vorlagen(id),
    bezug_id INTEGER,
    typ TEXT NOT NULL,
    score REAL,
    konfidenz REAL,
    begruendung TEXT,
    anmerkungen TEXT,
    unsicher BOOLEAN DEFAULT FALSE,
    review_grund TEXT,
    modell TEXT,
    prompt_version TEXT,
    erstellt_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_ki_bewertungen_vorlage ON ki_bewertungen(vorlage_id);
CREATE INDEX IF NOT EXISTS idx_ki_bewertungen_typ ON ki_bewertungen(typ);
