DROP TABLE Abteilungen CASCADE CONSTRAINTS;
DROP TABLE Angestellte CASCADE CONSTRAINTS;
DROP TABLE Artikel CASCADE CONSTRAINTS;
DROP TABLE Preishistorie CASCADE CONSTRAINTS;
DROP TABLE Lieferanten CASCADE CONSTRAINTS;
DROP TABLE Lieferung CASCADE CONSTRAINTS;
DROP TABLE Lieferungsdetails CASCADE CONSTRAINTS;
DROP TABLE Adresse CASCADE CONSTRAINTS;

CREATE TABLE Adresse (
    Id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
    Strasse VARCHAR2(60) NOT NULL,
    HausNr NUMBER(5) NOT NULL CHECK (HausNr > 0),
    Stadt VARCHAR2(60) NOT NULL,
    PLZ NUMBER(10) NOT NULL CHECK (PLZ > 0),
    Land VARCHAR2(60) NOT NULL
);

CREATE TABLE Abteilungen (
    Id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
    Name VARCHAR2(50) NOT NULL,
    AbteilungsleiterId NUMBER
);

CREATE TABLE Angestellte (
    Id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
    Personalnummer NUMBER UNIQUE NOT NULL CHECK (Personalnummer > 0),
    Name VARCHAR2(50) NOT NULL,
    AdresseId NUMBER  NOT NULL,
    AbteilungsId NUMBER,
    CONSTRAINT fk_adresse FOREIGN KEY (AdresseId) REFERENCES Adresse(Id),
    CONSTRAINT fk_abteilung FOREIGN KEY (AbteilungsId) REFERENCES Abteilungen(Id)
);

CREATE TABLE Artikel (
    Id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
    Bezeichnung VARCHAR2(50)  NOT NULL,
    Verkaufspreis NUMBER  NOT NULL CHECK (Verkaufspreis >= 0),
    SupermarktArtikelnummer VARCHAR2(50) UNIQUE  NOT NULL CHECK (LENGTH(SupermarktArtikelnummer) >= 4),
    AbteilungsId NUMBER  NOT NULL,
    Vorrat Number DEFAULT 0 CHECK (Vorrat >= 0) NOT NULL,
    CONSTRAINT fk_artikel_abteilung FOREIGN KEY (AbteilungsId) REFERENCES Abteilungen(Id)
);

CREATE TABLE Preishistorie (
    Id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
    ArtikelId NUMBER  NOT NULL,
    GueltigAb DATE NOT NULL,
    Preis NUMBER NOT NULL,
    Typ VARCHAR2(50) NOT NULL CHECK (Typ IN ('Normalpreis', 'Aktionspreis')),
    CONSTRAINT fk_preishistorie_artikel FOREIGN KEY (ArtikelId) REFERENCES Artikel(Id)
);

CREATE TABLE Lieferanten (
    Id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
    Name VARCHAR2(50) NOT NULL,
    AdresseId NUMBER NOT NULL,
    CONSTRAINT fk_lieferanten_adresse FOREIGN KEY (AdresseId) REFERENCES Adresse(Id)
);

CREATE TABLE Lieferung (
    Id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
    LieferantId NUMBER NOT NULL CHECK (LieferantId > 0),
    Lieferdatum DATE NOT NULL,
    CONSTRAINT fk_lieferung_lieferant FOREIGN KEY (LieferantId) REFERENCES Lieferanten(Id)
);

CREATE TABLE Lieferungsdetails (
    Id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
    LieferungsId NUMBER NOT NULL,
    ArtikelId NUMBER NOT NULL,
    Kaufpreis NUMBER NOT NULL CHECK (Kaufpreis >= 0),
    Menge NUMBER NOT NULL CHECK (Menge > 0),
    LieferantArtikelnummer VARCHAR2(50) NOT NULL,
    CONSTRAINT fk_lieferungsdetails_lieferung FOREIGN KEY (LieferungsId) REFERENCES Lieferung(Id),
    CONSTRAINT fk_lieferungsdetails_artikel FOREIGN KEY (ArtikelId) REFERENCES Artikel(Id)
);

--INSERTS

--Daten für die Tabelle Adresse
INSERT INTO Adresse (Strasse, HausNr, Stadt, PLZ, Land) VALUES ('Hauptstraße', 1, 'Wien', 1010, 'Österreich');
INSERT INTO Adresse (Strasse, HausNr, Stadt, PLZ, Land) VALUES ('Bahnhofstraße', 15, 'Linz', 4020, 'Österreich');
INSERT INTO Adresse (Strasse, HausNr, Stadt, PLZ, Land) VALUES ('Marktplatz', 3, 'Salzburg', 5020, 'Österreich');

--Daten für die Tabelle Abteilungen
INSERT INTO Abteilungen (Name) VALUES ('Milchprodukte');
INSERT INTO Abteilungen (Name) VALUES ('Backwaren');
INSERT INTO Abteilungen (Name) VALUES ('Süßes');

--Daten für die Tabelle Angestellte
INSERT INTO Angestellte (Personalnummer, Name, AdresseId, AbteilungsId) VALUES (1001, 'Matthias Watzinger', 1, 1);
INSERT INTO Angestellte (Personalnummer, Name, AdresseId, AbteilungsId) VALUES (1002, 'Anna Schmidt', 2, 2);
INSERT INTO Angestellte (Personalnummer, Name, AdresseId, AbteilungsId) VALUES (1003, 'Felix Huber', 3, 3);

--Daten für die Tabelle Artikel
INSERT INTO Artikel (Bezeichnung, Verkaufspreis, SupermarktArtikelnummer, AbteilungsId, Vorrat) VALUES ('Milch', 1.29, 'A1001', 1, 10);
INSERT INTO Artikel (Bezeichnung, Verkaufspreis, SupermarktArtikelnummer, AbteilungsId, Vorrat) VALUES ('Brot', 2.49, 'A1002', 1, 5);
INSERT INTO Artikel (Bezeichnung, Verkaufspreis, SupermarktArtikelnummer, AbteilungsId, Vorrat) VALUES ('Haribo Gummibärchen', 2.99, 'A1003', 1, 100);

--Daten für die Tabelle Preishistorie
INSERT INTO Preishistorie (ArtikelId, GueltigAb, Preis, Typ) VALUES (1, TO_DATE('2024-01-01', 'YYYY-MM-DD'), 1.19, 'Aktionspreis');
INSERT INTO Preishistorie (ArtikelId, GueltigAb, Preis, Typ) VALUES (2, TO_DATE('2024-02-01', 'YYYY-MM-DD'), 2.39, 'Normalpreis');
INSERT INTO Preishistorie (ArtikelId, GueltigAb, Preis, Typ) VALUES (3, TO_DATE('2024-03-01', 'YYYY-MM-DD'), 2.79, 'Aktionspreis');

--Daten für die Tabelle Lieferanten
INSERT INTO Lieferanten (Name, AdresseId) VALUES ('Frisch & Gut GmbH', 1);
INSERT INTO Lieferanten (Name, AdresseId) VALUES ('Bäckerei Sonnenschein', 2);
INSERT INTO Lieferanten (Name, AdresseId) VALUES ('Dairy Fresh AG', 3);

--Daten für die Tabelle Lieferung
INSERT INTO Lieferung (LieferantId, Lieferdatum) VALUES (1, TO_DATE('2024-03-15', 'YYYY-MM-DD'));
INSERT INTO Lieferung (LieferantId, Lieferdatum) VALUES (2, TO_DATE('2024-03-16', 'YYYY-MM-DD'));
INSERT INTO Lieferung (LieferantId, Lieferdatum) VALUES (3, TO_DATE('2024-03-17', 'YYYY-MM-DD'));

--Daten für die Tabelle Lieferungsdetails
INSERT INTO Lieferungsdetails (LieferungsId, ArtikelId, Kaufpreis, Menge, LieferantArtikelnummer) VALUES (1, 1, 0.99, 100, 'L1001');
INSERT INTO Lieferungsdetails (LieferungsId, ArtikelId, Kaufpreis, Menge, LieferantArtikelnummer) VALUES (1, 2, 3, 50, 'L1001');
INSERT INTO Lieferungsdetails (LieferungsId, ArtikelId, Kaufpreis, Menge, LieferantArtikelnummer) VALUES (2, 2, 1.99, 50, 'L1002');
INSERT INTO Lieferungsdetails (LieferungsId, ArtikelId, Kaufpreis, Menge, LieferantArtikelnummer) VALUES (3, 3, 2.49, 75, 'L1003');

--ALTER und UPDATEs
UPDATE Abteilungen SET AbteilungsleiterId = 1 WHERE Id = 1; -- Matthias Watzinger as Leiter of Milchprodukte
UPDATE Abteilungen SET AbteilungsleiterId = 2 WHERE Id = 2; -- Anna Schmidt as Leiter of Backwaren
UPDATE Abteilungen SET AbteilungsleiterId = 3 WHERE Id = 3; -- Felix Huber as Leiter of Süßes;

ALTER TABLE Abteilungen
ADD CONSTRAINT fk_abteilungsleiter FOREIGN KEY (AbteilungsleiterId) REFERENCES Angestellte(Id);

--SELECT (Grundlegend)
SELECT * FROM Adresse;
SELECT * FROM Abteilungen;
SELECT * FROM Angestellte;
SELECT * FROM Artikel;
SELECT * FROM Preishistorie;
SELECT * FROM Lieferanten;
SELECT * FROM Lieferung;
SELECT * FROM Lieferungsdetails;