ALTER TABLE `vending_machines` DROP INDEX IF EXISTS `idx_serial_unique`;
ALTER TABLE `vending_machines` DROP INDEX IF EXISTS `idx_inventory_unique`;

-- Добавляем уникальные индексы
ALTER TABLE `vending_machines` 
ADD UNIQUE INDEX `idx_serial_unique` (`serial_number`),
ADD UNIQUE INDEX `idx_inventory_unique` (`inventory_number`);


-- 2. Формат дат ДД.ММ.ГГГГ (0.25 балла)
-- Добавляем необходимые поля с типом DATE
ALTER TABLE `vending_machines` 
ADD COLUMN IF NOT EXISTS `manufacture_date` DATE COMMENT 'Дата изготовления',
ADD COLUMN IF NOT EXISTS `commissioning_date` DATE COMMENT 'Дата ввода в эксплуатацию',
ADD COLUMN IF NOT EXISTS `last_verification_date` DATE COMMENT 'Дата последней поверки',
ADD COLUMN IF NOT EXISTS `next_verification_date` DATE COMMENT 'Дата следующей поверки',
ADD COLUMN IF NOT EXISTS `next_maintenance_date` DATE COMMENT 'Дата следующего ремонта/обслуживания',
ADD COLUMN IF NOT EXISTS `inventory_date` DATE COMMENT 'Дата инвентаризации',
ADD COLUMN IF NOT EXISTS `system_entry_date` DATE DEFAULT (CURRENT_DATE) COMMENT 'Дата внесения в систему';

-- Добавляем межповерочный интервал (в месяцах)
ALTER TABLE `vending_machines` 
ADD COLUMN IF NOT EXISTS `verification_interval_months` INT DEFAULT 12 COMMENT 'Межповерочный интервал (месяцы)';


-- 3. Ограничение на дату ввода в эксплуатацию (0.2 балла)
-- Не может быть раньше даты изготовления и позже даты внесения в систему
DELIMITER //
DROP TRIGGER IF EXISTS `check_commissioning_date_insert` //
CREATE TRIGGER `check_commissioning_date_insert`
BEFORE INSERT ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.commissioning_date IS NOT NULL THEN
        -- Проверка: не раньше даты изготовления
        IF NEW.manufacture_date IS NOT NULL AND NEW.commissioning_date < NEW.manufacture_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата ввода в эксплуатацию не может быть раньше даты изготовления';
        END IF;
        
        -- Проверка: не позже даты внесения в систему
        IF NEW.system_entry_date IS NOT NULL AND NEW.commissioning_date > NEW.system_entry_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата ввода в эксплуатацию не может быть позже даты внесения в систему';
        END IF;
    END IF;
END //

DROP TRIGGER IF EXISTS `check_commissioning_date_update` //
CREATE TRIGGER `check_commissioning_date_update`
BEFORE UPDATE ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.commissioning_date IS NOT NULL THEN
        IF NEW.manufacture_date IS NOT NULL AND NEW.commissioning_date < NEW.manufacture_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата ввода в эксплуатацию не может быть раньше даты изготовления';
        END IF;
        
        IF NEW.system_entry_date IS NOT NULL AND NEW.commissioning_date > NEW.system_entry_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата ввода в эксплуатацию не может быть позже даты внесения в систему';
        END IF;
    END IF;
END //
DELIMITER ;


-- 4. Ограничение на дату последней поверки (0.2 балла)
-- Не может быть раньше даты изготовления и позже текущей даты
DELIMITER //
DROP TRIGGER IF EXISTS `check_last_verification_date_insert` //
CREATE TRIGGER `check_last_verification_date_insert`
BEFORE INSERT ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.last_verification_date IS NOT NULL THEN
        -- Не раньше даты изготовления
        IF NEW.manufacture_date IS NOT NULL AND NEW.last_verification_date < NEW.manufacture_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата последней поверки не может быть раньше даты изготовления';
        END IF;
        
        -- Не позже текущей даты
        IF NEW.last_verification_date > CURDATE() THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата последней поверки не может быть в будущем';
        END IF;
    END IF;
END //

DROP TRIGGER IF EXISTS `check_last_verification_date_update` //
CREATE TRIGGER `check_last_verification_date_update`
BEFORE UPDATE ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.last_verification_date IS NOT NULL THEN
        IF NEW.manufacture_date IS NOT NULL AND NEW.last_verification_date < NEW.manufacture_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата последней поверки не может быть раньше даты изготовления';
        END IF;
        
        IF NEW.last_verification_date > CURDATE() THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата последней поверки не может быть в будущем';
        END IF;
    END IF;
END //
DELIMITER ;


-- 5. Автоматический расчёт даты следующей поверки (0.4 балла)
-- На основе даты последней поверки + межповерочный интервал
DELIMITER //
DROP TRIGGER IF EXISTS `calculate_next_verification_insert` //
CREATE TRIGGER `calculate_next_verification_insert`
BEFORE INSERT ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.last_verification_date IS NOT NULL AND NEW.verification_interval_months IS NOT NULL THEN
        SET NEW.next_verification_date = DATE_ADD(NEW.last_verification_date, 
            INTERVAL NEW.verification_interval_months MONTH);
    END IF;
END //

DROP TRIGGER IF EXISTS `calculate_next_verification_update` //
CREATE TRIGGER `calculate_next_verification_update`
BEFORE UPDATE ON `vending_machines`
FOR EACH ROW
BEGIN
    -- Пересчитываем только если изменилась дата последней поверки или интервал
    IF (NEW.last_verification_date != OLD.last_verification_date 
        OR NEW.verification_interval_months != OLD.verification_interval_months) THEN
        
        IF NEW.last_verification_date IS NOT NULL AND NEW.verification_interval_months IS NOT NULL THEN
            SET NEW.next_verification_date = DATE_ADD(NEW.last_verification_date, 
                INTERVAL NEW.verification_interval_months MONTH);
        END IF;
    END IF;
END //
DELIMITER ;


-- 6. Ограничение на ресурс ТА (положительное число) (0.2 балла)
ALTER TABLE `vending_machines`
ADD CONSTRAINT `chk_resource_hours_positive` 
CHECK (`resource_hours` IS NULL OR `resource_hours` > 0);


-- 7. Ограничение на дату следующего ремонта/обслуживания (0.2 балла)
-- Должна быть позже даты внесения ТА в систему
DELIMITER //
DROP TRIGGER IF EXISTS `check_next_maintenance_date_insert` //
CREATE TRIGGER `check_next_maintenance_date_insert`
BEFORE INSERT ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.next_maintenance_date IS NOT NULL AND NEW.system_entry_date IS NOT NULL THEN
        IF NEW.next_maintenance_date < NEW.system_entry_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата следующего ремонта/обслуживания должна быть позже даты внесения в систему';
        END IF;
    END IF;
END //

DROP TRIGGER IF EXISTS `check_next_maintenance_date_update` //
CREATE TRIGGER `check_next_maintenance_date_update`
BEFORE UPDATE ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.next_maintenance_date IS NOT NULL AND NEW.system_entry_date IS NOT NULL THEN
        IF NEW.next_maintenance_date < NEW.system_entry_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата следующего ремонта/обслуживания должна быть позже даты внесения в систему';
        END IF;
    END IF;
END //
DELIMITER ;


-- 8. Ограничение на время обслуживания (от 1 до 20 часов) (0.2 балла)
-- Добавляем поле если его нет
ALTER TABLE `services`
ADD COLUMN IF NOT EXISTS `service_hours` DECIMAL(4,2) COMMENT 'Время обслуживания (часы)';

ALTER TABLE `services`
ADD CONSTRAINT `chk_service_hours_range` 
CHECK (`service_hours` IS NULL OR (`service_hours` >= 1 AND `service_hours` <= 20));


-- 9. Ограничение на статус (список выбора) (0.25 балла)
-- Работает, Вышел из строя, В ремонте/на обслуживании
ALTER TABLE `vending_machines`
MODIFY COLUMN `equipment_status` ENUM(
    'Работает', 
    'Вышел из строя', 
    'В ремонте/на обслуживании'
) DEFAULT 'Работает' COMMENT 'Статус оборудования';


-- 10. Ограничение на страну производства (список выбора) (0.4 балла)
ALTER TABLE `vending_machines`
MODIFY COLUMN `country` ENUM(
    'Россия',
    'Китай',
    'Япония',
    'Германия',
    'США',
    'Южная Корея',
    'Италия',
    'Франция',
    'Великобритания',
    'Швеция',
    'Финляндия',
    'Польша',
    'Чехия',
    'Турция',
    'Беларусь',
    'Казахстан'
) COMMENT 'Страна производства';


-- 11. Ограничение на дату инвентаризации (0.2 балла)
-- Не может быть раньше даты изготовления и позже текущей даты
DELIMITER //
DROP TRIGGER IF EXISTS `check_inventory_date_insert` //
CREATE TRIGGER `check_inventory_date_insert`
BEFORE INSERT ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.inventory_date IS NOT NULL THEN
        -- Не раньше даты изготовления
        IF NEW.manufacture_date IS NOT NULL AND NEW.inventory_date < NEW.manufacture_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата инвентаризации не может быть раньше даты изготовления';
        END IF;
        
        -- Не позже текущей даты
        IF NEW.inventory_date > CURDATE() THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата инвентаризации не может быть в будущем';
        END IF;
    END IF;
END //

DROP TRIGGER IF EXISTS `check_inventory_date_update` //
CREATE TRIGGER `check_inventory_date_update`
BEFORE UPDATE ON `vending_machines`
FOR EACH ROW
BEGIN
    IF NEW.inventory_date IS NOT NULL THEN
        IF NEW.manufacture_date IS NOT NULL AND NEW.inventory_date < NEW.manufacture_date THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата инвентаризации не может быть раньше даты изготовления';
        END IF;
        
        IF NEW.inventory_date > CURDATE() THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Дата инвентаризации не может быть в будущем';
        END IF;
    END IF;
END //
DELIMITER ;