DROP DATABASE IF EXISTS Petstoredb;
CREATE DATABASE Petstoredb;
USE Petstoredb;

-- Create Tables

CREATE TABLE storeLocation (
    storeId BIGINT AUTO_INCREMENT PRIMARY KEY,
    storeName VARCHAR(100) NOT NULL,
    address VARCHAR(255) NOT NULL,
    phone VARCHAR(20) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE employee (
    employeeId BIGINT AUTO_INCREMENT PRIMARY KEY,
    firstName VARCHAR(50) NOT NULL,
    lastName VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    phone VARCHAR(20) NOT NULL,
    role VARCHAR(50) NOT NULL,
    isActive BOOLEAN DEFAULT TRUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE employeeStore (
    employeeId BIGINT NOT NULL,
    storeId BIGINT NOT NULL,
    PRIMARY KEY (employeeId, storeId),
    FOREIGN KEY (employeeId) REFERENCES employee(employeeId),
    FOREIGN KEY (storeId) REFERENCES storeLocation(storeId)
);

CREATE TABLE customer (
    customerId BIGINT AUTO_INCREMENT PRIMARY KEY,
    firstName VARCHAR(50) NOT NULL,
    lastName VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    phone VARCHAR(20) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE pet (
    petId BIGINT AUTO_INCREMENT PRIMARY KEY,
    petName VARCHAR(50) NOT NULL,
    petSpecies VARCHAR(50) NOT NULL,
    petBreed VARCHAR(50) NOT NULL,
    petAge INT NOT NULL,
    petStatus VARCHAR(20) NOT NULL,
    petPrice DECIMAL(10, 2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE adoption (
    adoptionId BIGINT AUTO_INCREMENT PRIMARY KEY,
    petId BIGINT NOT NULL,
    customerId BIGINT NOT NULL,
    adoptionDate DATE NOT NULL,
    adoptionStatus VARCHAR(20) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (petId) REFERENCES pet(petId),
    FOREIGN KEY (customerId) REFERENCES customer(customerId)
);

CREATE TABLE supplier (
    supId BIGINT AUTO_INCREMENT PRIMARY KEY,
    supCompany VARCHAR(100) NOT NULL,
    supContactFirstName VARCHAR(50) NOT NULL,
    supContactLastName VARCHAR(50) NOT NULL,
    supEmail VARCHAR(100) NOT NULL,
    supPhone VARCHAR(20) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE category (
    categoryId BIGINT AUTO_INCREMENT PRIMARY KEY,
    categoryName VARCHAR(100) NOT NULL,
    categoryType VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE product (
    prodId BIGINT AUTO_INCREMENT PRIMARY KEY,
    prodName VARCHAR(100) NOT NULL,
    prodPrice DECIMAL(10, 2) NOT NULL,
    categoryId BIGINT NOT NULL,
    prodDesc TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (categoryId) REFERENCES category(categoryId)
);

CREATE TABLE productSupplier (
    supId BIGINT NOT NULL,
    prodId BIGINT NOT NULL,
    cost DECIMAL(10, 2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (supId, prodId),
    FOREIGN KEY (supId) REFERENCES supplier(supId),
    FOREIGN KEY (prodId) REFERENCES product(prodId)
);

CREATE TABLE inventory (
    inventoryId BIGINT AUTO_INCREMENT PRIMARY KEY,
    prodId BIGINT NOT NULL,
    quantity INT DEFAULT 0 NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (prodId) REFERENCES product(prodId)
);

CREATE TABLE service (
    serviceId BIGINT AUTO_INCREMENT PRIMARY KEY,
    serviceName VARCHAR(100) NOT NULL,
    serviceDesc TEXT,
    serviceDuration INT NOT NULL,
    servicePrice DECIMAL(10, 2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE appointment (
    appointmentId BIGINT AUTO_INCREMENT PRIMARY KEY,
    serviceId BIGINT NOT NULL,
    customerId BIGINT NOT NULL,
    appointmentDate DATE NOT NULL,
    appointmentTime TIME NOT NULL,
    appointmentStatus VARCHAR(20) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (serviceId) REFERENCES service(serviceId),
    FOREIGN KEY (customerId) REFERENCES customer(customerId)
);

CREATE TABLE appointmentPet (
    appointmentId BIGINT NOT NULL,
    petId BIGINT NOT NULL,
    PRIMARY KEY (appointmentId, petId),
    FOREIGN KEY (appointmentId) REFERENCES appointment(appointmentId),
    FOREIGN KEY (petId) REFERENCES pet(petId)
);

CREATE TABLE sale (
    saleId BIGINT AUTO_INCREMENT PRIMARY KEY,
    saleDate DATETIME NOT NULL,
    totalAmount DECIMAL(10, 2) NOT NULL,
    paymentMethod VARCHAR(50) NOT NULL,
    employeeId BIGINT NOT NULL,
    storeId BIGINT NOT NULL,
    isRefund BOOLEAN DEFAULT FALSE NOT NULL,
    originalSaleId BIGINT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (employeeId) REFERENCES employee(employeeId),
    FOREIGN KEY (storeId) REFERENCES storeLocation(storeId),
    FOREIGN KEY (originalSaleId) REFERENCES sale(saleId)
);

CREATE TABLE saleItem (
    saleItemId BIGINT AUTO_INCREMENT PRIMARY KEY,
    saleId BIGINT NOT NULL,
    prodId BIGINT NOT NULL,
    quantity INT NOT NULL,
    unitPrice DECIMAL(10, 2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (saleId) REFERENCES sale(saleId),
    FOREIGN KEY (prodId) REFERENCES product(prodId)
);

CREATE TABLE purchaseOrder (
    purchaseOrderId BIGINT AUTO_INCREMENT PRIMARY KEY,
    supId BIGINT NOT NULL,
    orderDate DATE NOT NULL,
    status VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (supId) REFERENCES supplier(supId)
);

CREATE TABLE activityLog (
    logId BIGINT AUTO_INCREMENT PRIMARY KEY,
    employeeId BIGINT NOT NULL,
    activity TEXT NOT NULL,
    logTimestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    FOREIGN KEY (employeeId) REFERENCES employee(employeeId)
);

-- Backend-only table for API authentication
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    role VARCHAR(20) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Insert Sample Data

INSERT INTO storeLocation (storeName, address, phone, email)
VALUES
('Downtown Branch', '123 Main St', '123-456-7890', 'downtown@petshop.com'),
('North Branch', '456 North Ave', '987-654-3210', 'north@petshop.com'),
('West Side Store', '789 West Blvd', '555-123-4567', 'westside@petshop.com'),
('East End Shop', '321 East Road', '555-987-6543', 'eastend@petshop.com'),
('South Mall Location', '654 South Plaza', '555-246-8135', 'southmall@petshop.com');

INSERT INTO employee (firstName, lastName, email, phone, role, isActive)
VALUES
('John', 'Doe', 'john@petshop.com', '111-222-3333', 'Manager', TRUE),
('Sara', 'Smith', 'sara@petshop.com', '444-555-6666', 'Staff', TRUE),
('Michael', 'Johnson', 'michael@petshop.com', '222-333-4444', 'Groomer', TRUE),
('Lisa', 'Williams', 'lisa@petshop.com', '333-444-5555', 'Staff', TRUE),
('David', 'Brown', 'david@petshop.com', '555-666-7777', 'Veterinarian', TRUE),
('Emma', 'Davis', 'emma@petshop.com', '666-777-8888', 'Manager', FALSE);

INSERT INTO employeeStore (employeeId, storeId)
VALUES
(1, 1),
(2, 1),
(2, 2),
(3, 2),
(4, 3),
(5, 1),
(5, 4),
(6, 5);

INSERT INTO customer (firstName, lastName, email, phone)
VALUES
('Alex', 'Brown', 'alex@gmail.com', '777-888-9999'),
('Emily', 'Clark', 'emily@gmail.com', '666-555-4444'),
('James', 'Wilson', 'james@gmail.com', '888-999-0000'),
('Olivia', 'Martinez', 'olivia@gmail.com', '999-000-1111'),
('William', 'Anderson', 'william@gmail.com', '000-111-2222'),
('Sophia', 'Taylor', 'sophia@gmail.com', '111-222-3333');

INSERT INTO pet (petName, petSpecies, petBreed, petAge, petStatus, petPrice)
VALUES
('Buddy', 'Dog', 'Labrador', 2, 'Available', 500.00),
('Milo', 'Cat', 'Persian', 1, 'Available', 300.00),
('Charlie', 'Dog', 'Golden Retriever', 3, 'Available', 550.00),
('Luna', 'Cat', 'Siamese', 2, 'Adopted', 350.00),
('Max', 'Dog', 'Beagle', 1, 'Available', 450.00),
('Bella', 'Cat', 'Maine Coon', 4, 'Available', 400.00);

INSERT INTO adoption (petId, customerId, adoptionDate, adoptionStatus)
VALUES
(1, 1, '2026-01-15', 'Completed'),
(4, 3, '2026-01-20', 'Completed'),
(2, 2, '2026-01-25', 'Pending'),
(5, 4, '2026-02-01', 'Completed'),
(6, 5, '2026-02-02', 'Pending');

INSERT INTO supplier (supCompany, supContactFirstName, supContactLastName, supEmail, supPhone)
VALUES
('PetFood Inc', 'Robert', 'King', 'contact@petfood.com', '888-111-2222'),
('Toy World', 'Jennifer', 'Lee', 'sales@toyworld.com', '888-222-3333'),
('Pet Supplies Co', 'Kevin', 'White', 'info@petsupplies.com', '888-333-4444'),
('Animal Care Products', 'Nancy', 'Green', 'orders@animalcare.com', '888-444-5555'),
('Premium Pet Goods', 'Tom', 'Black', 'support@premiumpet.com', '888-555-6666');

INSERT INTO category (categoryName, categoryType)
VALUES
('Dog Food', 'Product'),
('Cat Toys', 'Product'),
('Bird Supplies', 'Product'),
('Aquarium', 'Product'),
('Small Animals', 'Product');

INSERT INTO product (prodName, prodPrice, categoryId, prodDesc)
VALUES
('Premium Dog Food', 50.00, 1, 'High quality dog food'),
('Cat Toy Ball', 10.00, 2, 'Colorful toy for cats'),
('Bird Cage Large', 120.00, 3, 'Spacious bird cage'),
('Fish Tank 20 Gallon',  80.00, 4, 'Complete aquarium kit'),
('Hamster Wheel',  15.00, 5, 'Exercise wheel for small pets'),
('Organic Dog Treats', 25.00, 1, 'Natural dog treats');

INSERT INTO productSupplier (supId, prodId, cost)
VALUES
(1, 1, 35.00),
(1, 2, 6.50),
(2, 2, 7.00),
(3, 3, 90.00),
(3, 4, 60.00),
(4, 5, 10.00),
(5, 6, 18.00),
(1, 6, 17.50);

INSERT INTO inventory (prodId, quantity)
VALUES
(1, 100),
(2, 200),
(3, 50),
(4, 30),
(5, 150),
(6, 75);

INSERT INTO service (serviceName, serviceDesc, serviceDuration, servicePrice)
VALUES
('Pet Grooming', 'Full grooming service', 60, 40.00),
('Nail Trimming', 'Quick nail trim', 15, 10.00),
('Bath and Brush', 'Bathing and brushing service', 45, 30.00),
('Veterinary Checkup', 'Complete health examination', 30, 75.00),
('Teeth Cleaning', 'Professional dental cleaning', 90, 100.00);

INSERT INTO appointment (serviceId, customerId, appointmentDate, appointmentTime, appointmentStatus)
VALUES
(1, 2, '2026-02-01', '10:30:00', 'Booked'),
(2, 1, '2026-02-03', '14:00:00', 'Booked'),
(3, 3, '2026-02-05', '09:00:00', 'Completed'),
(4, 4, '2026-02-07', '11:30:00', 'Booked'),
(5, 5, '2026-02-10', '15:00:00', 'Cancelled');

INSERT INTO appointmentPet (appointmentId, petId)
VALUES
(1, 2),
(2, 1),
(3, 3),
(4, 5),
(5, 6);

INSERT INTO sale (saleDate, totalAmount, paymentMethod, employeeId, storeId)
VALUES
-- January Sales
('2026-01-05 09:15:00', 125.00, 'Card', 1, 1),           -- Sale 1: Dog food + treats
('2026-01-08 11:30:00', 200.00, 'Card', 2, 1),           -- Sale 2: Bird cage + fish tank
('2026-01-12 14:20:00', 60.00, 'Cash', 3, 2),            -- Sale 3: Cat toys + hamster wheel
('2026-01-15 10:45:00', 150.00, 'Debit', 1, 1),          -- Sale 4: Dog food (bulk purchase)
('2026-01-18 16:30:00', 80.00, 'Card', 4, 3),            -- Sale 5: Fish tank
('2026-01-22 13:15:00', 95.00, 'Cash', 2, 2),            -- Sale 6: Mixed items
('2026-01-25 15:40:00', 240.00, 'Card', 5, 4),           -- Sale 7: Two bird cages
('2026-01-28 10:30:00', 80.00, 'Cash', 1, 1),            -- Sale 8: Dog food + cat toys
-- February Sales
('2026-02-01 09:00:00', 175.00, 'Card', 3, 3),           -- Sale 9: Dog food + treats (bulk)
('2026-02-03 11:20:00', 120.00, 'Card', 2, 1),           -- Sale 10: Bird cage
('2026-02-05 14:50:00', 45.00, 'Cash', 4, 2),            -- Sale 11: Hamster wheel + cat toys
('2026-02-08 16:15:00', 160.00, 'Debit', 1, 1),          -- Sale 12: Fish tank + accessories
('2026-02-10 10:25:00', 100.00, 'Card', 5, 4),           -- Sale 13: Dog treats (bulk)
('2026-02-12 13:45:00', 50.00, 'Cash', 2, 2),            -- Sale 14: Dog food
('2026-02-15 15:30:00', 85.00, 'Card', 3, 3),            -- Sale 15: Mixed pet supplies
('2026-02-18 11:10:00', 200.00, 'Card', 1, 1),           -- Sale 16: Bird cage + hamster wheel
('2026-02-20 14:35:00', 155.00, 'Debit', 4, 3),          -- Sale 17: Fish tank + cat toys
('2026-02-22 16:50:00', 75.00, 'Cash', 2, 1),            -- Sale 18: Dog treats + toys
('2026-02-24 10:15:00', 140.00, 'Card', 5, 4),           -- Sale 19: Dog food + treats
(NOW(), 95.00, 'Card', 1, 1);                            -- Sale 20: Recent sale (current timestamp)

INSERT INTO saleItem (saleId, prodId, quantity, unitPrice)
VALUES
-- Sale 1 items (Dog food + treats)
(1, 1, 2, 50.00),      -- 2x Premium Dog Food
(1, 6, 1, 25.00),      -- 1x Organic Dog Treats
-- Sale 2 items (Bird cage + fish tank)
(2, 3, 1, 120.00),     -- 1x Bird Cage Large
(2, 4, 1, 80.00),      -- 1x Fish Tank 20 Gallon
-- Sale 3 items (Cat toys + hamster wheel)
(3, 2, 3, 10.00),      -- 3x Cat Toy Ball
(3, 5, 2, 15.00),      -- 2x Hamster Wheel
-- Sale 4 items (Dog food bulk)
(4, 1, 3, 50.00),      -- 3x Premium Dog Food
-- Sale 5 items (Fish tank)
(5, 4, 1, 80.00),      -- 1x Fish Tank 20 Gallon
-- Sale 6 items (Mixed)
(6, 2, 4, 10.00),      -- 4x Cat Toy Ball
(6, 5, 1, 15.00),      -- 1x Hamster Wheel
(6, 6, 1, 25.00),      -- 1x Organic Dog Treats
(6, 1, 1, 50.00),      -- 1x Premium Dog Food (partial - discount applied)
-- Sale 7 items (Two bird cages)
(7, 3, 2, 120.00),     -- 2x Bird Cage Large
-- Sale 8 items (Dog food + cat toys)
(8, 1, 1, 50.00),      -- 1x Premium Dog Food
(8, 2, 3, 10.00),      -- 3x Cat Toy Ball
-- Sale 9 items (Dog food + treats bulk)
(9, 1, 3, 50.00),      -- 3x Premium Dog Food
(9, 6, 1, 25.00),      -- 1x Organic Dog Treats
-- Sale 10 items (Bird cage)
(10, 3, 1, 120.00),    -- 1x Bird Cage Large
-- Sale 11 items (Hamster wheel + cat toys)
(11, 5, 1, 15.00),     -- 1x Hamster Wheel
(11, 2, 3, 10.00),     -- 3x Cat Toy Ball
-- Sale 12 items (Fish tank + accessories)
(12, 4, 2, 80.00),     -- 2x Fish Tank 20 Gallon
-- Sale 13 items (Dog treats bulk)
(13, 6, 4, 25.00),     -- 4x Organic Dog Treats
-- Sale 14 items (Dog food)
(14, 1, 1, 50.00),     -- 1x Premium Dog Food
-- Sale 15 items (Mixed supplies)
(15, 2, 2, 10.00),     -- 2x Cat Toy Ball
(15, 5, 1, 15.00),     -- 1x Hamster Wheel
(15, 6, 2, 25.00),     -- 2x Organic Dog Treats
-- Sale 16 items (Bird cage + hamster wheel)
(16, 3, 1, 120.00),    -- 1x Bird Cage Large
(16, 4, 1, 80.00),     -- 1x Fish Tank 20 Gallon
-- Sale 17 items (Fish tank + cat toys)
(17, 4, 1, 80.00),     -- 1x Fish Tank 20 Gallon
(17, 1, 1, 50.00),     -- 1x Premium Dog Food
(17, 6, 1, 25.00),     -- 1x Organic Dog Treats
-- Sale 18 items (Dog treats + toys)
(18, 6, 2, 25.00),     -- 2x Organic Dog Treats
(18, 2, 2, 10.00),     -- 2x Cat Toy Ball
(18, 5, 1, 15.00),     -- 1x Hamster Wheel
-- Sale 19 items (Dog food + treats)
(19, 1, 2, 50.00),     -- 2x Premium Dog Food
(19, 6, 2, 25.00),     -- 2x Organic Dog Treats (discount applied)
-- Sale 20 items (Recent sale)
(20, 2, 5, 10.00),     -- 5x Cat Toy Ball
(20, 5, 3, 15.00);     -- 3x Hamster Wheel

INSERT INTO purchaseOrder (supId, orderDate, status)
VALUES
(1, '2025-01-15', 'Delivered'),
(2, '2025-01-20', 'Pending'),
(3, '2025-02-01', 'Delivered'),
(4, '2025-02-10', 'In Transit'),
(1, '2025-02-15', 'Pending');

INSERT INTO activityLog (employeeId, activity)
VALUES
(1, 'Created new sale'),
(2, 'Booked appointment'),
(3, 'Completed grooming service'),
(4, 'Processed inventory order'),
(5, 'Conducted health checkup'),
(1, 'Updated customer information');

-- Sample users created by DataInitializer (admin/admin123, staff/staff123)
