-- Bare Bone DDL to create and populate the SWIM DB of CSCI 4333

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

DROP SCHEMA IF EXISTS SWIM;
CREATE SCHEMA SWIM;
USE SWIM;

-- You may use the following DELETE TABLE
-- to ensure starting with a clean slate.
-- Note the DELETE TABLE is usually in the
-- reverse order of CREATE TABLE to ensure
-- no referential integrity violations.
DROP TABLE IF EXISTS Commitment;
DROP TABLE IF EXISTS V_Task;
DROP TABLE IF EXISTS V_TaskList;
DROP TABLE IF EXISTS Participation;
DROP TABLE IF EXISTS `Event`;
DROP TABLE IF EXISTS Meet;
DROP TABLE IF EXISTS LevelHistory;
DROP TABLE IF EXISTS OtherCaretaker;
DROP TABLE IF EXISTS Swimmer;
DROP TABLE IF EXISTS Venue;
DROP TABLE IF EXISTS Level;
DROP TABLE IF EXISTS Caretaker;
DROP TABLE IF EXISTS Coach;

-- Create tables
DROP TABLE IF EXISTS Coach;
CREATE TABLE Coach(
    CoachId      INT UNSIGNED AUTO_INCREMENT, 
    LName        VARCHAR(30) NOT NULL,
    FName        VARCHAR(30) NOT NULL,
    Phone        VARCHAR(12) NOT NULL,
    EMail        VARCHAR(60) NOT NULL,
    CONSTRAINT Coach_pk PRIMARY KEY(CoachId)
);

DROP TABLE IF EXISTS Caretaker;
CREATE TABLE Caretaker(
    CT_Id        INT UNSIGNED AUTO_INCREMENT, 
    LName        VARCHAR(30) NOT NULL,
    FName        VARCHAR(30) NOT NULL,
    Phone        VARCHAR(12) NOT NULL,
    EMail        VARCHAR(60) NOT NULL,
    CONSTRAINT Caretaker_pk PRIMARY KEY(CT_Id)
);

DROP TABLE IF EXISTS Level;
CREATE TABLE Level(
    LevelId      INT UNSIGNED, 
    -- ok to use smaller INT such as TINYINT
    Level        VARCHAR(30) NOT NULL,
    Description  VARCHAR(250),
    CONSTRAINT level_pk PRIMARY KEY(LevelId),
    CONSTRAINT level_ck_1 UNIQUE(Level)
);

DROP TABLE IF EXISTS Venue;
CREATE TABLE Venue(
    VenueId     INT UNSIGNED AUTO_INCREMENT, 
    -- ok to use smaller INT such as SMALLINT
    Name        VARCHAR(100) NOT NULL,
    Address     VARCHAR(100) NOT NULL,
    City        VARCHAR(50) NOT NULL,
    State       VARCHAR(15) NOT NULL,
    ZipCode     VARCHAR(10) NOT NULL,
    Phone       VARCHAR(12) NOT NULL,
    CONSTRAINT venue_pk PRIMARY KEY(VenueId),
    CONSTRAINT venue_ck_1 UNIQUE(Name)
);

DROP TABLE IF EXISTS Swimmer;
CREATE TABLE Swimmer(
    SwimmerId       INT UNSIGNED AUTO_INCREMENT, 
    LName           VARCHAR(30) NOT NULL,
    FName           VARCHAR(30) NOT NULL,
    Phone           VARCHAR(12) NOT NULL,
    EMail           VARCHAR(60) NOT NULL,
    JoinTime        DATE NOT NULL,
    CurrentLevelId  INT UNSIGNED NOT NULL,
    Main_CT_Id      INT UNSIGNED NOT NULL,
    Main_CT_Relationship VARCHAR(30) NOT NULL,
    Main_CT_Since   DATE NOT NULL,
    CONSTRAINT swimmer_pk PRIMARY KEY(SwimmerId),
    CONSTRAINT swimmer_level_fk FOREIGN KEY(CurrentLevelId) 
        REFERENCES Level(LevelId),
    CONSTRAINT swimmer_caretaker_fk FOREIGN KEY(Main_CT_Id) 
        REFERENCES Caretaker(CT_Id)
);

DROP TABLE IF EXISTS OtherCaretaker;
CREATE TABLE OtherCaretaker(
    OC_Id        INT UNSIGNED AUTO_INCREMENT, 
    SwimmerId    INT UNSIGNED NOT NULL,
    CT_Id        INT UNSIGNED NOT NULL,
    Relationship VARCHAR(30) NOT NULL,
    Since        DATE NOT NULL,
    CONSTRAINT othercaretaker_pk PRIMARY KEY(OC_Id),
    CONSTRAINT othercaretaker_swimmer_fk FOREIGN KEY(SwimmerId) 
        REFERENCES Swimmer(SwimmerId),
    CONSTRAINT othercaretaker_caretaker_fk FOREIGN KEY(CT_Id) 
        REFERENCES Caretaker(CT_Id)
);

DROP TABLE IF EXISTS LevelHistory;
CREATE TABLE LevelHistory(
    LH_Id        INT UNSIGNED AUTO_INCREMENT, 
    SwimmerId    INT UNSIGNED NOT NULL,
    LevelId      INT UNSIGNED NOT NULL,
    StartDate    DATE NOT NULL,
    Comment      VARCHAR(250),
    CONSTRAINT levelhistory_pk PRIMARY KEY(LH_Id),
    CONSTRAINT levelhistory_ck_1 UNIQUE(SwimmerId, LevelId),
    CONSTRAINT levelhistory_swimmer_fk FOREIGN KEY(SwimmerId) 
        REFERENCES Swimmer(SwimmerId),
    CONSTRAINT levelhistory_level_fk FOREIGN KEY(LevelId) 
        REFERENCES Level(LevelId)
);

DROP TABLE IF EXISTS Meet;
CREATE TABLE Meet(
    MeetId      INT UNSIGNED AUTO_INCREMENT, 
    Title       VARCHAR(100) NOT NULL,
    Date        DATE NOT NULL,
    StartTime   TIME NOT NULL,
    EndTime     TIME NOT NULL,
    VenueId     INT UNSIGNED NOT NULL,
    CoachId     INT UNSIGNED NOT NULL,
    CONSTRAINT meet_pk PRIMARY KEY(MeetId),
    CONSTRAINT meet_venue_fk FOREIGN KEY(VenueId) 
        REFERENCES Venue(VenueId),
    CONSTRAINT meet_coach_fk FOREIGN KEY(CoachId) 
        REFERENCES Coach(CoachId)
);

DROP TABLE IF EXISTS `Event`;
CREATE TABLE `Event`(
    EventId      INT UNSIGNED AUTO_INCREMENT, 
    Title        VARCHAR(100) NOT NULL,
    StartTime    TIME NOT NULL,
    EndTime      TIME NOT NULL,
    MeetId       INT UNSIGNED NOT NULL,
    LevelId      INT UNSIGNED NOT NULL,
    CONSTRAINT event_pk PRIMARY KEY(EventId),
    CONSTRAINT event_meet_fk FOREIGN KEY(MeetId) 
        REFERENCES Meet(MeetId),
    CONSTRAINT event_level_fk FOREIGN KEY(LevelId) 
        REFERENCES Level(LevelId)
);

DROP TABLE IF EXISTS Participation;
CREATE TABLE Participation(
    ParticipationId INT UNSIGNED AUTO_INCREMENT, 
    SwimmerId       INT UNSIGNED NOT NULL,
    EventId         INT UNSIGNED NOT NULL,
    Committed       BOOLEAN,
    CommitTime      DATETIME,
    Participated    BOOLEAN,
    Result          VARCHAR(100),
    Comment         VARCHAR(100),
    CommentCoachId  INT UNSIGNED,
    CONSTRAINT participation_pk PRIMARY KEY(ParticipationId),
    CONSTRAINT participation_ck_1 UNIQUE(SwimmerId, EventId),
    CONSTRAINT participation_swimmer_fk FOREIGN KEY(SwimmerId) 
        REFERENCES Swimmer(SwimmerId),
    CONSTRAINT participation_event_fk FOREIGN KEY(EventId) 
        REFERENCES `Event`(EventId),
    CONSTRAINT participation_coach_fk FOREIGN KEY(CommentCoachId) 
        REFERENCES Coach(CoachId)
);

DROP TABLE IF EXISTS V_TaskList;
CREATE TABLE V_TaskList(
    VTL_Id      INT UNSIGNED AUTO_INCREMENT, 
    MeetId      INT UNSIGNED NOT NULL,
    Required    BOOLEAN NOT NULL,
    Description VARCHAR(250) NOT NULL,
    Penalty     VARCHAR(100),
    PenaltyAmt  DECIMAL(6,2),
    CONSTRAINT v_tasklist_pk PRIMARY KEY(VTL_Id),
    CONSTRAINT v_tasklist_meet_fk FOREIGN KEY(MeetId) 
        REFERENCES Meet(MeetId)
);

DROP TABLE IF EXISTS V_Task;
CREATE TABLE V_Task(
    VT_Id       INT UNSIGNED AUTO_INCREMENT, 
    VTL_Id      INT UNSIGNED NOT NULL,
    Name        VARCHAR(100) NOT NULL,
    Comment     VARCHAR(250),
    Num_V       SMALLINT UNSIGNED DEFAULT 1,
    CONSTRAINT v_task_pk PRIMARY KEY(VT_Id),
    CONSTRAINT v_task_v_tasklist_fk FOREIGN KEY(VTL_Id) 
        REFERENCES V_TaskList(VTL_Id)
);

DROP TABLE IF EXISTS Commitment;
CREATE TABLE Commitment(
    CommitmentId    INT UNSIGNED AUTO_INCREMENT, 
    CT_Id           INT UNSIGNED NOT NULL,
    VT_Id           INT UNSIGNED NOT NULL,
    CommitTime      DATETIME NOT NULL,
    Rescinded       BOOLEAN,
    RescindTime     DATETIME,
    CarriedOut      BOOLEAN,
    Comment         VARCHAR(100),
    CommentCoachId  INT UNSIGNED,
    CONSTRAINT commitment_pk PRIMARY KEY(CommitmentId),
    CONSTRAINT commitment_ck_1 UNIQUE(CT_Id, VT_Id),
    CONSTRAINT commitment_caretaker_fk FOREIGN KEY(CT_Id) 
        REFERENCES Caretaker(CT_Id),
    CONSTRAINT commitment_v_task_fk FOREIGN KEY(VT_Id)
        REFERENCES V_Task(VT_Id),
    CONSTRAINT commitment_coach_fk FOREIGN KEY(CommentCoachId) 
        REFERENCES Coach(CoachId)
);

-- Populate the Swim DB of CSCI 4333

INSERT INTO Coach(CoachId, FName, LName, Phone, EMail) VALUES
    (1,'Joe', 'Smith', '713-222-9413', 'joesmile_1061@gmail.com'),
    (2,'Jane', 'Smith', '713-222-9414', 'janesmile_1061@gmail.com'),
    (3,'Paul', 'Lam', '713-486-2011', 'paulkkk@hotmail.com'),
    (4,'Paulina', 'Hall', '832-486-1997', 'paulinathenice@yahoo.com'),
    (5,'Katrina', 'Bajaj', '832-117-2435', 'KatrinaBajaj@gmail.com');
     
INSERT INTO Caretaker(CT_Id, FName, LName, Phone, EMail) VALUES
    (1,'Azalea', 'Khan', '832-116-2992', 'theAKhan@gmail.com'),
    (2,'Joseph', 'Khan', '832-116-2993', 'theJKhan@gmail.com'),
    (3,'Jim', 'Khan', '832-116-2994', 'theJKhan2@gmail.com'),
    (4,'Katie', 'Johnson', '713-014-0090', 'KatieJohnson1010@yahoo.com'),
    (5,'Elizabeth', 'Johnson', '713-014-2090', 'EJohnson5111@yahoo.com'),
    (6,'Benjamin', 'Smith', '281-290-1929', 'BSmith_honeywell@gmail.com');

INSERT INTO Level (LevelId, Level, Description) VALUES
    (1, 'Green', 'First Level'),
    (2, 'Blue', 'Second level'),
    (3, 'Yellow', 'Third level'),
    (4, 'Pink', 'Fourth level'),
    (5, 'Orange', 'Fifth level'),
    (6, 'Lime', 'Six level'),
    (7, 'Purple', 'Seventh level'),
    (8, 'Red', 'Eigth level'),
    (9, 'Brown', 'Ninth level'),
    (10, 'Black', 'Tenth level');

INSERT INTO Venue(VenueId, Name, Address, City, State, ZipCode, Phone) VALUES
    (1,'UHCL', '2700 Bay Area Boulevard', 'Houston','Texas', 
        '77058', '281-283-3700'),
    (2,'CLHS', '3300 Bay Area Boulevard', 'Houston', 'Texas',
        '77059', '713-126-4544'),
    (3,'BAHEP', '1260 Gemini Way Boulevard', 'Webster', 'Texas',
        '77047', '713-789-2999');
       
INSERT INTO Swimmer(SwimmerId, FName, LName, Phone, EMail, JoinTime, 
    CurrentLevelId, Main_CT_Id, Main_CT_Relationship, Main_CT_Since) VALUES
    (1,'Bobby', 'Khan', '832-116-2992', 'theBKhan1@gmail.com',
        '2014-2-12', 3, 1, 'Mother', '2014-2-12'),
    (2,'Billy', 'Khan', '832-116-2992', 'theBKhan2@gmail.com',
        '2015-12-12', 2, 1, 'Mother', '2015-12-12'),
    (3,'Nina', 'Khan', '832-116-2992', 'theNinaKhan@gmail.com',
        '2016-5-12', 2, 2, 'Father', '2017-5-12'),
    (4,'Clara', 'Johnson', '713-222-1010', 'ClaraJohnson_11@yahoo.com',
        '2013-5-12', 3, 4, 'Mother', '2015-5-12'),
    (5,'Philip', 'Johnson', '713-222-1010', 'PhilipJohnson_108@yahoo.com',
        '2015-5-15', 2, 5, 'Mother', '2015-5-15'),
    (6, 'Joe', 'Fen', '271-909-2733', 'JoeFenTheGreat@gmail.com',
        '2018-3-13', 5, 4, 'Aunt', '2019-1-1');
   
INSERT INTO OtherCaretaker(SwimmerId, CT_Id, Relationship, Since) VALUES
    (1,2,'Uncle','2014-2-12'),
    (1,3,'Uncle','2014-2-12'),
    (2,3,'Uncle','2016-1-3'),
    (3,1,'Aunt','2016-5-12'),
    (3,3,'Adult Friend','2016-5-12'),
    (4,5,'Aunt','2016-1-12');  

INSERT INTO LevelHistory(SwimmerId, LevelId, StartDate) VALUES
    (1,2,'2014-7-15'),
    (2,1,'2015-12-12'),
    (2,2,'2016-4-15'),
    (3,1,'2016-5-12'),
    (4,2,'2014-6-1'),
    (4,3,'2015-10-2'),
    (5,1,'2015-5-15'),
    (5,2,'2016-3-15'),
    (6,5,'2018-2-14');
    
INSERT INTO LevelHistory(SwimmerId, LevelId, StartDate, Comment) VALUES
    (1,1,'2014-2-12','Good spirit'),
    (1,3,'2016-1-19','Fast time'),
    (3,2,'2016-7-12', 'Fast advance'),
    (4,1,'2013-5-12','Freestyle best'),
    (6,4,'2018-1-1','Club record in Freestyle50');
     
INSERT INTO Meet(MeetId, Title, Date, StartTime, EndTime, VenueId, CoachId) VALUES
    (1,'UHCL Open', '2016-3-3', '09:00:00', '16:00:00', 1, 1),
    (2,'Shell Trial', '2016-8-4', '08:00:00', '11:00:00', 2, 1),
    (3,'Clear Lake Contest', '2019-7-4', '10:00:00', '15:00:00', 2, 2);
 
INSERT INTO Event(EventId,Title, StartTime, EndTime, MeetId, LevelId) VALUES
    (1,'50M Butterfly', '09:10:00', '09:30:00', 1, 2),
    (2,'100M Freestyle', '09:40:00', '09:50:00', 1, 2),
    (3,'100M Butterfly', '10:10:00', '10:30:00', 1, 3),
    (4,'200M Freestyle', '10:40:00', '10:50:00', 1, 3),
    (5,'50M Butterfly', '09:15:00', '09:35:00', 2, 2),
    (6,'100M Freestyle', '09:45:00', '09:55:00', 2, 2),
    (7,'100M Butterfly', '10:15:00', '10:35:00', 2, 3),
    (8,'200M Freestyle', '10:45:00', '10:55:00', 2, 3),
    (9,'100M Breaststroke', '11:15:00', '10:35:00', 2, 3),
    (10,'200M Backstroke', '10:15:00', '10:55:00', 3, 5),
    (11,'50M Breaststroke', '11:15:00', '10:35:00', 3, 3);

INSERT INTO Participation(SwimmerId, EventId) VALUES(2,1);
INSERT INTO Participation(SwimmerId, EventId, Committed)
    VALUES(3,1,1);
INSERT INTO Participation(SwimmerId, EventId, Committed, CommitTime, 
        Participated, Result, Comment, CommentCoachId)
    VALUES(5,1,1,'2016-2-20 10:00:00', 1, 'Winner', 'Good!', 2);
INSERT INTO Participation(SwimmerId, EventId)
    VALUES(3,2);
INSERT INTO Participation(SwimmerId, EventId, Committed)
    VALUES(2,2,1);
INSERT INTO Participation(SwimmerId, EventId, Committed, CommitTime, 
        Participated, Result, Comment, CommentCoachId)
    VALUES(5,2,1,'2016-2-20 10:00:00', 1, 'Winner', 'Second winner', 2);
INSERT INTO Participation(SwimmerId, EventId)
    VALUES(1,3);
INSERT INTO Participation(SwimmerId, EventId, Committed)
    VALUES(4,3,1);
INSERT INTO Participation(SwimmerId, EventId)
    VALUES(1,4);
INSERT INTO Participation(SwimmerId, EventId, Committed, CommitTime, 
        Participated, Result)
    VALUES(4,5,1,'2016-1-15 12:00:00', 1, 'Runner up');
INSERT INTO Participation(SwimmerId, EventId)
    VALUES(2,5);
INSERT INTO Participation(SwimmerId, EventId, Committed)
    VALUES(3,5,1);
INSERT INTO Participation(SwimmerId, EventId, Committed, CommitTime, 
        Participated, Result, Comment, CommentCoachId)
    VALUES(5,5,1,'2016-3-20 10:00:00', 1, '1:12:20', 'Good!', 1);
INSERT INTO Participation(SwimmerId, EventId, Committed, CommitTime, 
        Participated, Result, Comment, CommentCoachId)
    VALUES(2,6,1,'2016-3-9 10:00:00', 1, 'Good', 'Need to focus', 3);
INSERT INTO Participation(SwimmerId, EventId)
    VALUES(3,6);
INSERT INTO Participation(SwimmerId, EventId, Committed)
    VALUES(5,6,1);
INSERT INTO Participation(SwimmerId, EventId)
    VALUES(1,7);
INSERT INTO Participation(SwimmerId, EventId, Committed)
    VALUES(4,7,1);
INSERT INTO Participation(SwimmerId, EventId, Committed, CommitTime, 
        Participated, Result)
    VALUES(1,8,1,'2016-1-21 12:00:00', 1, 'winner');
INSERT INTO Participation(SwimmerId, EventId)
    VALUES(4,8);
INSERT INTO Participation(SwimmerId, EventId)
    VALUES(1,9),(3,9),(6,10),(1,11);

INSERT INTO V_TaskList(VTL_Id, MeetId, Required, Description)    
    VALUES(1,1,0,'UHCL meet volunteer tasks');
INSERT INTO V_TaskList(VTL_Id, MeetId, Required, Description, Penalty, PenaltyAmt)    
    VALUES(2,2,1,'Shell Trial meet volunteer tasks','3 credits', 0);
INSERT INTO V_TaskList(VTL_Id, MeetId, Required, Description)    
    VALUES(3,3,0,'Clear Lake Contest task lists');
    
INSERT INTO V_Task(VT_Id, VTL_Id, Name, Comment, Num_V) 
    VALUES(1,1,'Officiating','Must be trained',2);
INSERT INTO V_Task(VT_Id, VTL_Id, Name, Num_V)
    VALUES(2,1,'Recording',3);
INSERT INTO V_Task(VT_Id, VTL_Id, Name)
    VALUES(3,1,'Diecting traffic');
INSERT INTO V_Task(VT_Id, VTL_Id, Name, Comment, Num_V)
    VALUES(4,2,'Officiating','Must be trained',3);
INSERT INTO V_Task(VT_Id, VTL_Id, Name, Num_V)
    VALUES(5,2,'Recording',2);
INSERT INTO V_Task(VT_Id, VTL_Id, Name)
    VALUES(6,2,'Diecting traffic');
    
INSERT INTO Commitment(CT_Id, VT_Id, CommitTime) VALUES
    (1,1,'2015-10-10 11:11:12'),
    (4,1,'2015-10-11 12:11:20'),
    (2,2,'2016-1-10 11:05:12'),
    (3,2,'2016-1-11 12:12:20'),
    (5,2,'2016-1-17 09:19:25'),
    (1,3,'2015-10-10 11:11:12');
    
INSERT INTO Commitment(CT_Id, VT_Id, CommitTime,CarriedOut,
        Comment, CommentCoachId) VALUES
    (1,4,'2016-05-11 11:47:22',1,'Very dependable',1),
    (4,4,'2016-05-12 06:37:12',0,'Sick and called',1),
    (5,4,'2016-05-12 06:37:12',1,'Brought fruit',2);
INSERT INTO Commitment(CT_Id, VT_Id, CommitTime,Rescinded) VALUES
    (2,5,'2016-03-11 11:33:12',1),
    (4,5,'2016-03-17 12:35:14',0);
INSERT INTO Commitment(CT_Id, VT_Id, CommitTime) VALUES
    (1,5,'2016-05-11 11:47:22'),
    (5,6,'2016-06-11 09:15:22');
    
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;