USE PortDB;

INSERT INTO
    Purposes (Name, Description)
VALUES (
        'Перевезення сировини',
        'Перевезення різноманітних сировинних матеріалів на виробництво.'
    ),
    (
        'Експорт товарів',
        'Вивезення готової продукції за кордон для продажу.'
    ),
    (
        'Імпорт сировини',
        'Закупівля різноманітних сировинних матеріалів з-за кордону.'
    ),
    (
        'Транспортування контейнерів',
        'Перевезення контейнерів із товаром між портами.'
    ),
    (
        'Доставка харчових продуктів',
        'Перевезення продуктів харчування великими суднами.'
    ),
    (
        'Енергетичні цілі',
        'Транспортування палива та енергетичних ресурсів морем.'
    ),
    (
        'Будівельні матеріали',
        'Перевезення будівельних матеріалів для проектів на узбережжі.'
    ),
    (
        'Масова перевезення',
        'Транспортування великих обсягів товарів для оптових партнерів.'
    ),
    (
        'Транзитне сполучення',
        'Проходження через території кількох країн у маршруті доставки.'
    );

INSERT INTO
    CargoTypes (Name)
VALUES ('Контейнери'),
    ('Рідини'),
    ('Сипучі матеріали'),
    ('Сталеві вироби'),
    ('Деревинні матеріали'),
    ('Харчові продукти'),
    ('Технічне обладнання'),
    ('Автомобілі'),
    ('Товари загального вжитку'),
    ('Спеціальні вантажі');

INSERT INTO
    ShipTypes (Name)
VALUES ('Балкер'),
    ('Контейнеровоз'),
    ('Танкер'),
    ('Ро-Ро (Roll-on/Roll-off)'),
    ('Бункеровоз'),
    ('Круїзний лайнер'),
    ('Багатоцільовий корабель'),
    ('Трал'),
    ('Лінійний корабель'),
    (
        'Вантажівка-перевізник (Ferry)'
    ),
    ('Пасажирський корабель');

INSERT INTO
    Country (Name)
VALUES ('Австралія'),
    ('Австрія'),
    ('Азербайджан'),
    ('Албанія'),
    ('Алжир'),
    ('Ангола'),
    ('Андорра'),
    ('Аргентина'),
    ('Арменія'),
    ('Афганістан'),
    ('Багамські Острови'),
    ('Бангладеш'),
    ('Барбадос'),
    ('Бахрейн'),
    ('Беліз'),
    ('Бельгія'),
    ('Бенін'),
    ('Білорусь'),
    ('Болгарія'),
    ('Болівія'),
    ('Боснія і Герцеговина'),
    ('Ботсвана'),
    ('Бразилія'),
    ('Бруней'),
    ('Буркіна-Фасо'),
    ('Бурунді'),
    ('Бутан'),
    ('В\'єтнам'),
    ('Габон'),
    ('Гаїті'),
    ('Гайана'),
    ('Гамбія'),
    ('Гана'),
    ('Гваделупа'),
    ('Гватемала'),
    ('Гвінея'),
    ('Гвінея - Бісау'),
    ('Гондурас'),
    ('Гренада'),
    ('Греція'),
    ('Грузія'),
    ('Гренландія'),
    ('Данія'),
    (
        'Демократична Республіка Конго'
    ),
    ('Джибуті'),
    ('Домініка'),
    ('Домініканська Республіка'),
    ('Еквадор'),
    ('Екваторіальна Гвінея'),
    ('Еритрея'),
    ('Есватіні'),
    ('Естонія'),
    ('Ефіопія'),
    ('Єгипет'),
    ('Ємен'),
    ('Замбія'),
    ('Західна Сахара'),
    ('Зімбабве'),
    ('Ізраїль'),
    ('Індія'),
    ('Індонезія'),
    ('Ірак'),
    ('Іран'),
    ('Ірландія'),
    ('Ісландія'),
    ('Іспанія'),
    ('Італія'),
    ('Йорданія'),
    ('Казахстан'),
    ('Кайманові Острови'),
    ('Камбоджа'),
    ('Камерун'),
    ('Канада'),
    ('Катар'),
    ('Кенія'),
    ('Киргизстан'),
    ('Кіпр'),
    ('Кірібаті'),
    ('Китай'),
    ('Колумбія'),
    ('Коморські Острови'),
    ('Конго'),
    ('Північна Корея'),
    ('Південна Корея'),
    ('Косово'),
    ('Коста - Рика'),
    ('Куба'),
    ('Кувейт'),
    ('Лаос'),
    ('Латвія'),
    ('Лесото'),
    ('Литва'),
    ('Ліберія'),
    ('Ліван'),
    ('Лівія'),
    ('Ліхтенштейн'),
    ('Люксембург'),
    ('Маврикій'),
    ('Мавританія'),
    ('Мадагаскар'),
    ('Македонія'),
    ('Малаві'),
    ('Малайзія'),
    ('Малі'),
    ('Мальдіви'),
    ('Мальта'),
    ('Марокко'),
    ('Мартиніка'),
    ('Маршаллові Острови'),
    ('Мексика'),
    ('Мозамбік'),
    ('Молдова'),
    ('Монако'),
    ('Монголія'),
    ('М\'янма (Бірма)'),
    ('Намібія'),
    ('Науру'),
    ('Непал'),
    ('Нігер'),
    ('Нігерія'),
    ('Нідерланди'),
    ('Нікарагуа'),
    ('Німеччина'),
    ('Нова Зеландія'),
    ('Норвегія'),
    ('ОАЕ'),
    ('Оман'),
    ('Пакистан'),
    ('Палау'),
    ('Палестина'),
    ('Панама');

INSERT INTO
    Positions (Name)
VALUES ('Директор'),
    ('Менеджер з логістики'),
    ('Капітан корабля'),
    ('Інженер-механік'),
    ('Оператор порту'),
    ('Фінансовий аналітик'),
    ('Керівник вантажоперевезень'),
    (
        'Технік з обслуговування суден'
    ),
    ('Митний брокер'),
    ('Логістичний асистент');

INSERT INTO
    ContactTypes (Name)
VALUES ('Телефон'),
    ('Електронна пошта'),
    ('Факс'),
    ('Поштова адреса'),
    ('Skype'),
    ('WhatsApp'),
    ('Веб-сайт'),
    ('Телеграм');

INSERT INTO
    ServiceTypes (Name, Description)
VALUES (
        'Технічний огляд',
        'Комплексне технічне обстеження та оцінка стану судна.'
    ),
    (
        'Ремонт двигуна',
        'Виконання ремонтних робіт та технічного обслуговування суднового двигуна.'
    ),
    (
        'Мальовничі роботи',
        'Фарбування та зовнішній оздоблювальний ремонт корпусу судна.'
    ),
    (
        'Технічне обслуговування електроніки',
        'Проведення робіт з налаштування та ремонту електронних систем на судні.'
    ),
    (
        'Заміна обладнання',
        'Встановлення нового суднового обладнання та видалення застарілого.'
    ),
    (
        'Очищення та змазування',
        'Профілактичне очищення та змащення механізмів та обладнання судна.'
    );

INSERT INTO
    Voyages (CountryFromId, CountryToId)
SELECT (
        SELECT Id
        FROM Country
        ORDER BY RAND()
        LIMIT 1
    ) as CountryFromId, (
        SELECT Id
        FROM Country
        ORDER BY RAND()
        LIMIT 1
    ) as CountryToId
FROM (
        SELECT 1
        UNION
        SELECT 2
        UNION
        SELECT 3
        UNION
        SELECT 4
        UNION
        SELECT 5
    ) as Numbers;

INSERT INTO
    Persons (
        Passport,
        FirstName,
        LastName,
        PositionId
    )
VALUES (
        'AA123456',
        'Іван',
        'Петров',
        1
    ),
    (
        'BB789012',
        'Марія',
        'Іванова',
        2
    ),
    (
        'CC345678',
        'Олег',
        'Сидоров',
        3
    ),
    (
        'DD901234',
        'Наталія',
        'Коваленко',
        4
    ),
    (
        'EE567890',
        'Андрій',
        'Смирнов',
        5
    ),
    (
        'FF123890',
        'Тетяна',
        'Біліченко',
        6
    ),
    (
        'GG456789',
        'Дмитро',
        'Мельник',
        7
    ),
    (
        'HH678901',
        'Катерина',
        'Соколова',
        8
    ),
    (
        'II234567',
        'Валентин',
        'Жуков',
        9
    ),
    (
        'JJ890123',
        'Ольга',
        'Морозова',
        10
    ),
    (
        'KK345678',
        'Анна',
        'Кравченко',
        5
    ),
    (
        'LL901234',
        'Олександр',
        'Лисенко',
        8
    ),
    (
        'MM567890',
        'Євгенія',
        'Денисенко',
        2
    );

INSERT INTO
    ContactInfo (
        Content,
        PersonId,
        ContactTypeId
    )
VALUES ('+123456789', 1, 1),
    ('email@example.com', 2, 2),
    ('123 Main Street', 3, 3),
    ('SkypeID123', 4, 4),
    ('WhatsAppNumber', 5, 5),
    (
        'http://www.example.com',
        6,
        6
    ),
    ('TelegramUsername', 7, 7),
    ('FaxNumber', 8, 8),
    ('info@example.com', 9, 1),
    ('555-1234', 10, 2),
    ('456 Secondary Street', 11, 3),
    ('SkypeID456', 12, 4),
    ('TelegramUser567', 13, 7),
    ('ViberNumber', 1, 5),
    (
        'http://www.example2.com',
        2,
        6
    ),
    ('FaxNumber2', 3, 8);

INSERT INTO
    Users (Password, PersonId)
VALUES ('strongpassword1', 1),
    ('securepass123', 2),
    ('myp@ssw0rd', 3),
    ('pass4you', 4),
    ('secret123', 5);

INSERT INTO
    Docks (Name, MaxLength, MaxWidth)
VALUES ('Причал 1', 100, 20),
    ('Причал 2', 120, 25),
    ('Причал 3', 150, 30),
    ('Причал 4', 90, 15),
    ('Причал 5', 110, 18),
    ('Причал 6', 130, 22),
    ('Причал 7', 140, 28),
    ('Причал 8', 160, 35),
    ('Причал 9', 105, 17),
    ('Причал 10', 125, 23),
    ('Причал 11', 115, 19),
    ('Причал 12', 95, 14),
    ('Причал 13', 145, 27),
    ('Причал 14', 155, 33),
    ('Причал 15', 165, 38);

INSERT INTO
    Ships (
        Name,
        Length,
        Width,
        Capacity,
        ShipTypeId,
        VoyageId,
        DockId
    )
VALUES (
        'Корабель 1',
        50.5,
        10.5,
        500,
        1,
        1,
        1
    ),
    (
        'Корабель 2',
        60.2,
        12.8,
        700,
        2,
        2,
        2
    ),
    (
        'Корабель 3',
        55.0,
        11.0,
        600,
        3,
        3,
        3
    ),
    (
        'Корабель 4',
        45.8,
        9.5,
        450,
        4,
        4,
        4
    ),
    (
        'Корабель 10',
        59.9,
        12.0,
        690,
        10,
        10,
        10
    ),
    (
        'Корабель 11',
        57.2,
        11.2,
        590,
        11,
        11,
        11
    ),
    (
        'Корабель 12',
        63.8,
        13.8,
        770,
        5,
        12,
        12
    ),
    (
        'Корабель 13',
        52.4,
        10.8,
        540,
        3,
        9,
        13
    ),
    (
        'Корабель 14',
        49.0,
        9.8,
        480,
        6,
        8,
        14
    ),
    (
        'Корабель 15',
        66.5,
        14.0,
        820,
        8,
        5,
        15
    );

INSERT INTO
    Employees (PersonId)
SELECT id
FROM Persons
ORDER BY RAND()
LIMIT 5;

INSERT INTO
    Services (
        Date,
        Done,
        ShipId,
        ServiceTypeId
    )
SELECT
    NOW() - INTERVAL FLOOR(RAND() * 365) DAY AS Date,
    ROUND(RAND()) AS Done,
    (
        SELECT id
        FROM Ships
        ORDER BY RAND()
        LIMIT 1
    ) AS ShipId,
    ROUND(RAND() * 6) + 1 AS ServiceTypeId
FROM (
        SELECT id
        FROM `ShipTypes`
        LIMIT 5
    ) AS t;

INSERT INTO
    ServiceEmployee (EmployeeId, ServiceId)
SELECT ROUND(RAND() * 5) + 1 AS EmployeeId, ROUND(RAND() * 5) + 1 AS ServiceId
FROM (
        SELECT id
        FROM Services
        LIMIT 5
    ) AS t;

INSERT INTO
    DockEmplyee (DockId, EmployeeId)
VALUES (1, 1),
    (2, 2),
    (3, 3),
    (4, 1),
    (5, 5);

INSERT INTO
    CrewPersons (PersonId, ShipId)
SELECT ROUND(RAND() * (13 - 6) + 6) AS PersonId, (
        SELECT id
        FROM Ships
        ORDER BY RAND()
        LIMIT 1
    ) AS ShipId
FROM (
        SELECT id
        FROM `Ships`
        LIMIT 10
    ) AS t;

INSERT INTO
    Cargoes (
        Quantity,
        CargoTypeId,
        ShipId,
        PurposeId
    )
SELECT
    ROUND(RAND() * 100) + 1 AS Quantity,
    (
        SELECT id
        FROM CargoTypes
        ORDER BY RAND()
        LIMIT 1
    ) AS CargoTypeId,
    (
        SELECT id
        FROM Ships
        ORDER BY RAND()
        LIMIT 1
    ) AS ShipId,
    (
        SELECT id
        FROM Purposes
        ORDER BY RAND()
        LIMIT 1
    ) AS PurposeId
FROM (
        SELECT id
        FROM Ships
        LIMIT 10
    ) AS t;

SELECT Ships.Name, Voyages.CountryFromId
FROM Ships
    JOIN Voyages ON Ships.VoyageId = Voyages.Id
WHERE
    Voyages.CountryFromId = (
        SELECT id
        FROM `Country`
        ORDER BY RAND()
        LIMIT 1
    );

-- Вибірка кількості кораблів, що перебувають в кожному причалі:

SELECT Docks.Name AS DockName, COUNT(Ships.Id) AS ShipCount
FROM Docks
    LEFT JOIN Ships ON Docks.Id = Ships.DockId
GROUP BY
    Docks.Id;

-- Знаходження найбільшого та найменшого корабля за місткістю

SELECT MAX(Ships.Capacity) AS MaxCapacity, MIN(Ships.Capacity) AS MinCapacity
FROM Ships;

-- Вибірка інформації про всі обслуговування, які ще не виконані

SELECT
    Services.Id,
    Services.Date,
    Ships.Name AS ShipName,
    ServiceTypes.Name AS ServiceTypeName
FROM
    Services
    JOIN Ships ON Services.ShipId = Ships.Id
    JOIN ServiceTypes ON Services.ServiceTypeId = ServiceTypes.Id
WHERE
    Services.Done = 0;

-- Список працівників та кількість обслуговувань, які вони виконали

SELECT Employees.Id, Persons.FirstName, Persons.LastName, COUNT(ServiceEmployee.ServiceId) AS ServicesCount
FROM
    Employees
    JOIN Persons ON Employees.PersonId = Persons.Id
    LEFT JOIN ServiceEmployee ON Employees.Id = ServiceEmployee.EmployeeId
GROUP BY
    Employees.Id;

-- Список вантажів разом із цілями та назвою корабля:

SELECT Cargoes.Id, Purposes.Name AS PurposeName, Ships.Name AS ShipName, Cargoes.Quantity
FROM Cargoes
    JOIN Purposes ON Cargoes.PurposeId = Purposes.Id
    JOIN Ships ON Cargoes.ShipId = Ships.Id;

-- Загальний кількість вантажів, що відправляється з кожної країни:

SELECT Country.Name AS CountryName, SUM(Cargoes.Quantity) AS TotalCount
FROM
    Voyages
    JOIN Country ON Voyages.CountryFromId = Country.Id
    JOIN Ships ON Voyages.Id = Ships.VoyageId
    JOIN Cargoes ON Ships.Id = Cargoes.ShipId
GROUP BY
    Country.Id;