create database PortDB character set utf8 collate utf8_bin;

use PortDB;

CREATE TABLE `Users` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Password` nvarchar (1000) NOT NULL COMMENT 'Пароль',
    `PersonId` integer COMMENT 'Дані людини'
);

CREATE TABLE `Positions` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва позиції'
);

CREATE TABLE `ContactInfo` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Content` nvarchar (255) NOT NULL COMMENT 'Дані про контакт',
    `PersonId` integer COMMENT 'Людина',
    `ContactTypeId` integer COMMENT 'Тип контакту'
);

CREATE TABLE `ContactTypes` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва типи контакту'
);

CREATE TABLE `Services` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Date` timestamp NOT NULL COMMENT 'Дата обслуговування',
    `Done` boolean NOT NULL DEFAULT 0 COMMENT 'Виконане',
    `ShipId` integer COMMENT 'Корабель',
    `ServiceTypeId` integer COMMENT 'Тип обслуговування'
);

CREATE TABLE `ServiceTypes` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва типу',
    `Description` nvarchar (255) NOT NULL COMMENT 'Опис обслуговування'
);

CREATE TABLE `Ships` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (255) NOT NULL COMMENT 'Назва корабля',
    `Length` decimal(10, 2) NOT NULL COMMENT 'Довжина корабля',
    `Width` decimal(10, 2) NOT NULL COMMENT 'Ширина корабля',
    `Capacity` integer NOT NULL COMMENT 'Місткість корабля (у тоннах)',
    `ShipTypeId` integer COMMENT 'Тип корабля',
    `VoyageId` integer COMMENT 'Інформація про рейс',
    `DockId` integer COMMENT 'Причал'
);

CREATE TABLE `ShipTypes` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва типу'
);

CREATE TABLE `Docks` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (255) NOT NULL COMMENT 'Назва причалу',
    `MaxLength` integer NOT NULL COMMENT 'Максимальна довжина причалу',
    `MaxWidth` integer NOT NULL COMMENT 'Максимальна ширина причалу'
);

CREATE TABLE `Cargoes` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Quantity` integer NOT NULL COMMENT 'Кількість',
    `CargoTypeId` integer COMMENT 'Тип вантажу',
    `ShipId` integer COMMENT 'Корабель',
    `PurposeId` integer COMMENT 'Ціль'
);

CREATE TABLE `Purposes` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва цілі',
    `Description` nvarchar (255) NOT NULL COMMENT 'Опис цілі'
);

CREATE TABLE `CargoTypes` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва типу'
);

CREATE TABLE `Persons` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Passport` nvarchar (1000) UNIQUE NOT NULL COMMENT 'Паспортні дані',
    `FirstName` nvarchar (255) NOT NULL COMMENT 'Ім\'я',
    `LastName` nvarchar (255) NOT NULL COMMENT 'Прізвище',
    `PositionId` integer COMMENT 'Посада'
);

CREATE TABLE `CrewPersons` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `PersonId` integer COMMENT 'Дані людини',
    `ShipId` integer COMMENT 'Корабель'
);

CREATE TABLE `Employees` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `PersonId` integer COMMENT 'Дані людини'
);

CREATE TABLE `ServiceEmployee` (
    `EmployeeId` integer COMMENT 'Працівник',
    `ServiceId` integer COMMENT 'Обслуговування'
);

CREATE TABLE `Country` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `Name` nvarchar (50) UNIQUE NOT NULL COMMENT 'Назва країни'
);

CREATE TABLE `DockEmplyee` (
    `DockId` integer COMMENT 'Причал',
    `EmployeeId` integer COMMENT 'Працівник'
);

CREATE TABLE `Voyages` (
    `Id` integer PRIMARY KEY AUTO_INCREMENT,
    `CountryFromId` integer COMMENT 'Країна відправки',
    `CountryToId` integer COMMENT 'Країна доставки'
);

ALTER TABLE `Users`
ADD FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`);

ALTER TABLE `ContactInfo`
ADD FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`);

ALTER TABLE `ContactInfo`
ADD FOREIGN KEY (`ContactTypeId`) REFERENCES `ContactTypes` (`Id`);

ALTER TABLE `Services`
ADD FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`);

ALTER TABLE `Services`
ADD FOREIGN KEY (`ServiceTypeId`) REFERENCES `ServiceTypes` (`Id`);

ALTER TABLE `Ships`
ADD FOREIGN KEY (`ShipTypeId`) REFERENCES `ShipTypes` (`Id`);

ALTER TABLE `Ships`
ADD FOREIGN KEY (`VoyageId`) REFERENCES `Voyages` (`Id`);

ALTER TABLE `Ships`
ADD FOREIGN KEY (`DockId`) REFERENCES `Docks` (`Id`);

ALTER TABLE `Cargoes`
ADD FOREIGN KEY (`CargoTypeId`) REFERENCES `CargoTypes` (`Id`);

ALTER TABLE `Cargoes`
ADD FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`);

ALTER TABLE `Cargoes`
ADD FOREIGN KEY (`PurposeId`) REFERENCES `Purposes` (`Id`);

ALTER TABLE `Persons`
ADD FOREIGN KEY (`PositionId`) REFERENCES `Positions` (`Id`);

ALTER TABLE `CrewPersons`
ADD FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`);

ALTER TABLE `CrewPersons`
ADD FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`);

ALTER TABLE `Employees`
ADD FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`);

ALTER TABLE `ServiceEmployee`
ADD FOREIGN KEY (`EmployeeId`) REFERENCES `Employees` (`Id`);

ALTER TABLE `ServiceEmployee`
ADD FOREIGN KEY (`ServiceId`) REFERENCES `Services` (`Id`);

ALTER TABLE `DockEmplyee`
ADD FOREIGN KEY (`DockId`) REFERENCES `Docks` (`Id`);

ALTER TABLE `DockEmplyee`
ADD FOREIGN KEY (`EmployeeId`) REFERENCES `Employees` (`Id`);

ALTER TABLE `Voyages`
ADD FOREIGN KEY (`CountryFromId`) REFERENCES `Country` (`Id`);

ALTER TABLE `Voyages`
ADD FOREIGN KEY (`CountryToId`) REFERENCES `Country` (`Id`);