------ DROP ALL TABLES ------
--
-- Courtesy of: https://stackoverflow.com/questions/8439650/how-to-drop-all-tables-in-a-sql-server-database
--
-----------------------------

--DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

--SET @Cursor = CURSOR FAST_FORWARD FOR
--SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_SCHEMA + '].[' +  tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + '];'
--FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
--LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME

--OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

--WHILE (@@FETCH_STATUS = 0)
--BEGIN
--Exec sp_executesql @Sql
--FETCH NEXT FROM @Cursor INTO @Sql
--END

--CLOSE @Cursor DEALLOCATE @Cursor
--GO

--EXEC sp_MSforeachtable 'DROP TABLE ?'
--GO

-----------------------------

CREATE TYPE ImageType FROM VARCHAR(4) NULL
GO

CREATE TABLE [User] (
	ID INT IDENTITY(0, 1) NOT NULL,
	Email VARCHAR(254) NOT NULL,
	Username VARCHAR(32) NOT NULL,
	[Password] CHAR(64) NOT NULL,
	[Salt] CHAR(32) NOT NULL,
	Hue INT NOT NULL
		CONSTRAINT HueDefault DEFAULT 0
		CONSTRAINT HueConstraint CHECK (0 <= Hue AND Hue <= 360),
	ProfileImage ImageType,
	[Admin] BIT NOT NULL
		CONSTRAINT AdmivDefault DEFAULT 0,
	Verified BIT NOT NULL
		CONSTRAINT VerifiedDefault DEFAULT 0
	PRIMARY KEY(ID)
)

CREATE TABLE [Platform] (
	ID INT IDENTITY(0, 1) NOT NULL,
	PlatformName VARCHAR(32) NOT NULL,
	Icon ImageType
	PRIMARY KEY(ID)
)

CREATE TABLE [Game] (
	ID INT IDENTITY(0, 1) NOT NULL,
	Name VARCHAR(32) NOT NULL,
	Icon ImageType
	PRIMARY KEY(ID)
)

CREATE TABLE [Achievement] (
	ID INT IDENTITY(0, 1) NOT NULL,
	GameID INT NOT NULL,
	Name VARCHAR(128) NOT NULL,
	Description VARCHAR(512) NULL,
	Stages INT NOT NULL,
	Icon ImageType
	PRIMARY KEY(ID)
	FOREIGN KEY(GameID) REFERENCES [Game](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE
)

CREATE TABLE [Owns] (
	UserID INT NOT NULL,
	GameID INT NOT NULL,
	PlatformID INT NOT NULL
	PRIMARY KEY(UserID, GameID, PlatformID)
	FOREIGN KEY(UserID) REFERENCES [User](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE,
	FOREIGN KEY(GameID) REFERENCES [Game](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE,
	FOREIGN KEY(PlatformID) REFERENCES [Platform](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE
)

CREATE TABLE [Progress] (
	UserID INT NOT NULL,
	PlatformID INT NOT NULL,
	AchievementID INT NOT NULL,
	Progress INT NOT NULL
	PRIMARY KEY(UserID, PlatformID, AchievementID)
	FOREIGN KEY(UserID) REFERENCES [User](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE,
	FOREIGN KEY(PlatformID) REFERENCES [Platform](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE,
	FOREIGN KEY(AchievementID) REFERENCES [Achievement](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE
)

CREATE TABLE [IsOn] (
	UserID INT NOT NULL,
	PlatformID INT NOT NULL,
	PlatformUserID VARCHAR(32) NOT NULL
	PRIMARY KEY(UserID, PlatformID)
	FOREIGN KEY(UserID) REFERENCES [User](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE,
	FOREIGN KEY(PlatformID) REFERENCES [Platform](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE
)

CREATE TABLE [ExistsOn] (
	GameID INT NOT NULL,
	PlatformID INT NOT NULL,
	PlatformGameID VARCHAR(32) NOT NULL
	PRIMARY KEY(GameID, PlatformID)
	FOREIGN KEY(GameID) REFERENCES [Game](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE,
	FOREIGN KEY(PlatformID) REFERENCES [Platform](ID)
		ON UPDATE CASCADE
)

CREATE TABLE [Rating] (
	UserID INT NOT NULL,
	AchievementID INT NOT NULL,
	Quality FLOAT NULL,
	Difficulty FLOAT NULL,
	[Description] VARCHAR(1024) NULL
	PRIMARY KEY(UserID, AchievementID)
	FOREIGN KEY(UserID) REFERENCES [User](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE,
	FOREIGN KEY(AchievementID) REFERENCES [Achievement](ID)
		ON UPDATE CASCADE
		ON DELETE CASCADE
)
