-- ============================================================
-- Tierarztpraxis DWH — Star Schema (PostgreSQL)
-- Kapitel 19: Data Warehousing
-- ============================================================

DROP TABLE IF EXISTS fakt_behandlung CASCADE;
DROP TABLE IF EXISTS dim_zeit CASCADE;
DROP TABLE IF EXISTS dim_tier CASCADE;
DROP TABLE IF EXISTS dim_tierarzt CASCADE;
DROP TABLE IF EXISTS dim_diagnose CASCADE;
DROP TABLE IF EXISTS dim_praxis CASCADE;

-- ============================================================
-- Dimensionstabellen (denormalisiert)
-- ============================================================

CREATE TABLE dim_zeit (
  zeit_id    SERIAL PRIMARY KEY,
  datum      DATE NOT NULL UNIQUE,
  wochentag  VARCHAR(10),
  monat      INT,
  monatsname VARCHAR(10),
  quartal    INT,
  jahr       INT
);

CREATE TABLE dim_tier (
  tier_id    SERIAL PRIMARY KEY,
  name       VARCHAR(50),
  tierart    VARCHAR(30),
  rasse      VARCHAR(50),
  geschlecht CHAR(1),
  besitzer   VARCHAR(80),
  ort        VARCHAR(50)
);

CREATE TABLE dim_tierarzt (
  tierarzt_id SERIAL PRIMARY KEY,
  name        VARCHAR(80),
  rolle       VARCHAR(30),
  praxis      VARCHAR(80),
  gueltig_von DATE DEFAULT '2000-01-01',
  gueltig_bis DATE DEFAULT '9999-12-31',
  aktuell     BOOLEAN DEFAULT TRUE
);

CREATE TABLE dim_diagnose (
  diagnose_id SERIAL PRIMARY KEY,
  diagnose    VARCHAR(100),
  kategorie   VARCHAR(50)
);

CREATE TABLE dim_praxis (
  praxis_id SERIAL PRIMARY KEY,
  name      VARCHAR(80),
  ort       VARCHAR(50),
  region    VARCHAR(30)
);

-- ============================================================
-- Faktentabelle
-- ============================================================

CREATE TABLE fakt_behandlung (
  behandlung_id SERIAL PRIMARY KEY,
  zeit_id       INT NOT NULL REFERENCES dim_zeit,
  tier_id       INT NOT NULL REFERENCES dim_tier,
  tierarzt_id   INT NOT NULL REFERENCES dim_tierarzt,
  diagnose_id   INT NOT NULL REFERENCES dim_diagnose,
  praxis_id     INT NOT NULL REFERENCES dim_praxis,
  kosten        NUMERIC(10,2) NOT NULL,
  dauer_min     INT,
  medikamente   INT DEFAULT 0
);

-- ============================================================
-- Zeitdimension fuellen (2025-01-01 bis 2026-06-30)
-- ============================================================

INSERT INTO dim_zeit (datum, wochentag, monat, monatsname, quartal, jahr)
SELECT d,
       to_char(d, 'Dy'),
       EXTRACT(MONTH FROM d)::INT,
       to_char(d, 'Mon'),
       EXTRACT(QUARTER FROM d)::INT,
       EXTRACT(YEAR FROM d)::INT
FROM generate_series('2025-01-01'::DATE, '2026-06-30'::DATE, '1 day') AS d;

-- ============================================================
-- Praxen
-- ============================================================

INSERT INTO dim_praxis (name, ort, region) VALUES
  ('Tierarztpraxis Juckstadt', 'Juckstadt', 'Mittelhessen'),
  ('Kleintierpraxis Waldrand', 'Bellhausen', 'Mittelhessen'),
  ('Pferdepraxis Schmidt', 'Reitdorf', 'Oberhessen');

-- ============================================================
-- Tieraerzte
-- ============================================================

INSERT INTO dim_tierarzt (name, rolle, praxis) VALUES
  ('Dr. Jo Katzner', 'Tierarzt', 'Tierarztpraxis Juckstadt'),
  ('Kim Canini', 'Tieraerztin', 'Tierarztpraxis Juckstadt'),
  ('Dr. Mueller', 'Tierarzt', 'Kleintierpraxis Waldrand'),
  ('Dr. Schmidt', 'Tierarzt', 'Pferdepraxis Schmidt');

-- ============================================================
-- Tiere (denormalisiert: Tierart+Rasse+Besitzer in einer Tabelle)
-- ============================================================

INSERT INTO dim_tier (name, tierart, rasse, geschlecht, besitzer, ort) VALUES
  ('Bello',   'Hund',    'Labrador',           'm', 'Hans Berger',  'Juckstadt'),
  ('Rex',     'Hund',    'Schaeferhund',        'm', 'Anna Waldner', 'Juckstadt'),
  ('Luna',    'Hund',    'Golden Retriever',    'w', 'Tom Fuchs',    'Juckstadt'),
  ('Mimi',    'Katze',   'Perser',              'w', 'Hans Berger',  'Juckstadt'),
  ('Minka',   'Katze',   'Europaeisch Kurzhaar','w', 'Lisa Meier',   'Bellhausen'),
  ('Felix',   'Katze',   'Maine Coon',          'm', 'Eva Braun',    'Bellhausen'),
  ('Speedy',  'Schildkroete','Griechische',     'm', 'Tom Fuchs',    'Juckstadt'),
  ('Tweety',  'Wellensittich','Standard',       'm', 'Tom Fuchs',    'Juckstadt'),
  ('Hanni',   'Kaninchen','Zwergkaninchen',     'w', 'Sara Klein',   'Bellhausen'),
  ('Blitz',   'Pferd',   'Hannoveraner',        'm', 'Karl Reiter',  'Reitdorf'),
  ('Sternchen','Pferd',  'Haflinger',           'w', 'Maria Hof',    'Reitdorf'),
  ('Bruno',   'Hund',    'Boxer',               'm', 'Eva Braun',    'Bellhausen');

-- ============================================================
-- Diagnosen
-- ============================================================

INSERT INTO dim_diagnose (diagnose, kategorie) VALUES
  ('Impfung',              'Vorsorge'),
  ('Entwurmung',           'Vorsorge'),
  ('Routineuntersuchung',  'Vorsorge'),
  ('Bisswunde',            'Verletzung'),
  ('Knochenbruch',         'Verletzung'),
  ('Ohrenentzuendung',     'Infektion'),
  ('Katzenschnupfen',      'Infektion'),
  ('Hautpilz',             'Infektion'),
  ('Zahnstein',            'Zahnmedizin'),
  ('Kastration',           'Chirurgie'),
  ('Tumor-OP',             'Chirurgie'),
  ('Lahmheit',             'Orthopaedie'),
  ('Kolik',                'Notfall'),
  ('Panzerkontrolle',      'Vorsorge'),
  ('Federrupfen',          'Verhalten');

-- ============================================================
-- Behandlungen (60 Fakten, verteilt ueber 2025-Q1 bis 2026-Q2)
-- ============================================================

INSERT INTO fakt_behandlung
  (zeit_id, tier_id, tierarzt_id, diagnose_id, praxis_id,
   kosten, dauer_min, medikamente)
SELECT z.zeit_id, t.tier_id, ta.tierarzt_id, d.diagnose_id, p.praxis_id,
       v.kosten, v.dauer_min, v.medikamente
FROM (VALUES
  -- 2025 Q1
  ('2025-01-08', 'Bello',  'Dr. Jo Katzner', 'Impfung',             'Tierarztpraxis Juckstadt', 45.00,  15, 1),
  ('2025-01-10', 'Mimi',   'Kim Canini',     'Entwurmung',          'Tierarztpraxis Juckstadt', 25.00,  10, 1),
  ('2025-01-15', 'Rex',    'Dr. Jo Katzner', 'Bisswunde',           'Tierarztpraxis Juckstadt', 120.00, 45, 2),
  ('2025-01-22', 'Minka',  'Dr. Mueller',    'Katzenschnupfen',     'Kleintierpraxis Waldrand', 85.00,  30, 2),
  ('2025-02-05', 'Blitz',  'Dr. Schmidt',    'Lahmheit',            'Pferdepraxis Schmidt',     180.00, 60, 1),
  ('2025-02-12', 'Luna',   'Kim Canini',     'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 35.00,  20, 0),
  ('2025-02-20', 'Felix',  'Dr. Mueller',    'Hautpilz',            'Kleintierpraxis Waldrand', 65.00,  25, 1),
  ('2025-03-03', 'Speedy', 'Dr. Jo Katzner', 'Panzerkontrolle',     'Tierarztpraxis Juckstadt', 55.00,  20, 0),
  ('2025-03-10', 'Hanni',  'Dr. Mueller',    'Routineuntersuchung', 'Kleintierpraxis Waldrand', 30.00,  15, 0),
  ('2025-03-18', 'Bello',  'Dr. Jo Katzner', 'Zahnstein',           'Tierarztpraxis Juckstadt', 95.00,  40, 1),
  -- 2025 Q2
  ('2025-04-02', 'Sternchen','Dr. Schmidt',  'Impfung',             'Pferdepraxis Schmidt',     60.00,  20, 1),
  ('2025-04-10', 'Rex',    'Dr. Jo Katzner', 'Impfung',             'Tierarztpraxis Juckstadt', 45.00,  15, 1),
  ('2025-04-15', 'Mimi',   'Kim Canini',     'Impfung',             'Tierarztpraxis Juckstadt', 40.00,  15, 1),
  ('2025-04-22', 'Bruno',  'Dr. Mueller',    'Ohrenentzuendung',    'Kleintierpraxis Waldrand', 70.00,  25, 2),
  ('2025-05-05', 'Blitz',  'Dr. Schmidt',    'Impfung',             'Pferdepraxis Schmidt',     60.00,  20, 1),
  ('2025-05-12', 'Tweety', 'Kim Canini',     'Federrupfen',         'Tierarztpraxis Juckstadt', 35.00,  15, 1),
  ('2025-05-20', 'Luna',   'Dr. Jo Katzner', 'Kastration',          'Tierarztpraxis Juckstadt', 250.00, 90, 2),
  ('2025-06-03', 'Felix',  'Dr. Mueller',    'Kastration',          'Kleintierpraxis Waldrand', 220.00, 80, 2),
  ('2025-06-10', 'Minka',  'Dr. Mueller',    'Impfung',             'Kleintierpraxis Waldrand', 40.00,  15, 1),
  ('2025-06-18', 'Bello',  'Dr. Jo Katzner', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 35.00,  20, 0),
  -- 2025 Q3
  ('2025-07-02', 'Rex',    'Kim Canini',     'Ohrenentzuendung',    'Tierarztpraxis Juckstadt', 65.00,  25, 2),
  ('2025-07-15', 'Hanni',  'Dr. Mueller',    'Impfung',             'Kleintierpraxis Waldrand', 30.00,  15, 1),
  ('2025-07-22', 'Sternchen','Dr. Schmidt',  'Lahmheit',            'Pferdepraxis Schmidt',     200.00, 60, 1),
  ('2025-08-05', 'Bello',  'Dr. Jo Katzner', 'Impfung',             'Tierarztpraxis Juckstadt', 45.00,  15, 1),
  ('2025-08-12', 'Mimi',   'Kim Canini',     'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 30.00,  15, 0),
  ('2025-08-20', 'Bruno',  'Dr. Mueller',    'Impfung',             'Kleintierpraxis Waldrand', 45.00,  15, 1),
  ('2025-09-03', 'Blitz',  'Dr. Schmidt',    'Kolik',               'Pferdepraxis Schmidt',     350.00, 120, 3),
  ('2025-09-10', 'Luna',   'Dr. Jo Katzner', 'Impfung',             'Tierarztpraxis Juckstadt', 45.00,  15, 1),
  ('2025-09-18', 'Felix',  'Dr. Mueller',    'Routineuntersuchung', 'Kleintierpraxis Waldrand', 30.00,  15, 0),
  ('2025-09-25', 'Speedy', 'Dr. Jo Katzner', 'Panzerkontrolle',     'Tierarztpraxis Juckstadt', 55.00,  20, 0),
  -- 2025 Q4
  ('2025-10-06', 'Rex',    'Dr. Jo Katzner', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 35.00,  20, 0),
  ('2025-10-15', 'Minka',  'Dr. Mueller',    'Entwurmung',          'Kleintierpraxis Waldrand', 25.00,  10, 1),
  ('2025-10-22', 'Bello',  'Dr. Jo Katzner', 'Ohrenentzuendung',    'Tierarztpraxis Juckstadt', 70.00,  30, 2),
  ('2025-11-04', 'Sternchen','Dr. Schmidt',  'Routineuntersuchung', 'Pferdepraxis Schmidt',     80.00,  30, 0),
  ('2025-11-12', 'Hanni',  'Dr. Mueller',    'Kastration',          'Kleintierpraxis Waldrand', 150.00, 60, 2),
  ('2025-11-20', 'Mimi',   'Kim Canini',     'Katzenschnupfen',     'Tierarztpraxis Juckstadt', 85.00,  30, 2),
  ('2025-12-02', 'Bruno',  'Dr. Mueller',    'Routineuntersuchung', 'Kleintierpraxis Waldrand', 35.00,  20, 0),
  ('2025-12-10', 'Blitz',  'Dr. Schmidt',    'Impfung',             'Pferdepraxis Schmidt',     60.00,  20, 1),
  ('2025-12-18', 'Luna',   'Kim Canini',     'Entwurmung',          'Tierarztpraxis Juckstadt', 25.00,  10, 1),
  ('2025-12-22', 'Tweety', 'Kim Canini',     'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 30.00,  15, 0),
  -- 2026 Q1
  ('2026-01-08', 'Bello',  'Dr. Jo Katzner', 'Impfung',             'Tierarztpraxis Juckstadt', 45.00,  15, 1),
  ('2026-01-12', 'Rex',    'Dr. Jo Katzner', 'Bisswunde',           'Tierarztpraxis Juckstadt', 130.00, 50, 2),
  ('2026-01-20', 'Minka',  'Dr. Mueller',    'Routineuntersuchung', 'Kleintierpraxis Waldrand', 30.00,  15, 0),
  ('2026-02-03', 'Felix',  'Dr. Mueller',    'Entwurmung',          'Kleintierpraxis Waldrand', 25.00,  10, 1),
  ('2026-02-10', 'Sternchen','Dr. Schmidt',  'Knochenbruch',        'Pferdepraxis Schmidt',     450.00, 180, 3),
  ('2026-02-18', 'Mimi',   'Kim Canini',     'Impfung',             'Tierarztpraxis Juckstadt', 40.00,  15, 1),
  ('2026-03-05', 'Bello',  'Dr. Jo Katzner', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 35.00,  20, 0),
  ('2026-03-12', 'Hanni',  'Dr. Mueller',    'Routineuntersuchung', 'Kleintierpraxis Waldrand', 30.00,  15, 0),
  ('2026-03-20', 'Blitz',  'Dr. Schmidt',    'Lahmheit',            'Pferdepraxis Schmidt',     200.00, 60, 1),
  ('2026-03-28', 'Luna',   'Dr. Jo Katzner', 'Impfung',             'Tierarztpraxis Juckstadt', 45.00,  15, 1),
  -- 2026 Q2
  ('2026-04-05', 'Bruno',  'Dr. Mueller',    'Zahnstein',           'Kleintierpraxis Waldrand', 90.00,  35, 1),
  ('2026-04-12', 'Rex',    'Kim Canini',     'Impfung',             'Tierarztpraxis Juckstadt', 45.00,  15, 1),
  ('2026-04-20', 'Speedy', 'Dr. Jo Katzner', 'Panzerkontrolle',     'Tierarztpraxis Juckstadt', 55.00,  20, 0),
  ('2026-05-05', 'Mimi',   'Kim Canini',     'Entwurmung',          'Tierarztpraxis Juckstadt', 25.00,  10, 1),
  ('2026-05-12', 'Blitz',  'Dr. Schmidt',    'Routineuntersuchung', 'Pferdepraxis Schmidt',     80.00,  30, 0),
  ('2026-05-20', 'Minka',  'Dr. Mueller',    'Impfung',             'Kleintierpraxis Waldrand', 40.00,  15, 1),
  ('2026-06-03', 'Bello',  'Dr. Jo Katzner', 'Tumor-OP',            'Tierarztpraxis Juckstadt', 380.00, 120, 3),
  ('2026-06-10', 'Felix',  'Dr. Mueller',    'Impfung',             'Kleintierpraxis Waldrand', 40.00,  15, 1),
  ('2026-06-18', 'Sternchen','Dr. Schmidt',  'Impfung',             'Pferdepraxis Schmidt',     60.00,  20, 1),
  ('2026-06-25', 'Luna',   'Kim Canini',     'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 30.00,  15, 0)
) AS v(datum, tier, tierarzt, diagnose, praxis, kosten, dauer_min, medikamente)
JOIN dim_zeit z ON z.datum = v.datum::DATE
JOIN dim_tier t ON t.name = v.tier
JOIN dim_tierarzt ta ON ta.name = v.tierarzt
JOIN dim_diagnose d ON d.diagnose = v.diagnose
JOIN dim_praxis p ON p.name = v.praxis;

-- ============================================================
-- Pruefung
-- ============================================================

SELECT 'dim_zeit' AS tabelle, COUNT(*) FROM dim_zeit
UNION ALL SELECT 'dim_tier', COUNT(*) FROM dim_tier
UNION ALL SELECT 'dim_tierarzt', COUNT(*) FROM dim_tierarzt
UNION ALL SELECT 'dim_diagnose', COUNT(*) FROM dim_diagnose
UNION ALL SELECT 'dim_praxis', COUNT(*) FROM dim_praxis
UNION ALL SELECT 'fakt_behandlung', COUNT(*) FROM fakt_behandlung;
