-- ============================================
-- BANCO DE DADOS PROJETO_UM
-- ============================================

CREATE DATABASE IF NOT EXISTS `projeto_um`
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

USE `projeto_um`;

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

-- ============================================
-- REMOVER OBJETOS ANTIGOS
-- Evita erro caso você importe mais de uma vez
-- ============================================

DROP TRIGGER IF EXISTS `tgdeleteleituraeduardo`;
DROP TRIGGER IF EXISTS `tginsertleituraeduardo`;
DROP TRIGGER IF EXISTS `tgvalidamaceduardo`;

DROP PROCEDURE IF EXISTS `validamaceduardo`;

DROP TABLE IF EXISTS `leituraeduardo`;
DROP TABLE IF EXISTS `maceduardo`;

-- ============================================
-- TABELA MAC
-- ============================================

CREATE TABLE `maceduardo` (
    `idmaceduardo` VARCHAR(17) NOT NULL,
    `nome` VARCHAR(25) DEFAULT NULL,
    `contador` INT UNSIGNED DEFAULT 0,
    `limite` INT UNSIGNED DEFAULT 0,
    `ativo` TINYINT(1) DEFAULT 0,

    PRIMARY KEY (`idmaceduardo`)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;

-- ============================================
-- DADOS INICIAIS
-- ============================================

INSERT INTO `maceduardo`
(`idmaceduardo`, `nome`, `contador`, `limite`, `ativo`)
VALUES
('01:02:03', 'Placa Um', 1, 1000, 1);

-- ============================================
-- TABELA LEITURA
-- ============================================

CREATE TABLE `leituraeduardo` (
    `idleituraeduardo` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `maceduardo_idmaceduardo` VARCHAR(17) NOT NULL,
    `datahora` DATETIME DEFAULT NULL,
    `valor` INT UNSIGNED DEFAULT NULL,

    PRIMARY KEY (`idleituraeduardo`),

    KEY `leituraeduardo_FKIndex1`
    (`maceduardo_idmaceduardo`),

    CONSTRAINT `leituraeduardo_ibfk_1`
    FOREIGN KEY (`maceduardo_idmaceduardo`)
    REFERENCES `maceduardo` (`idmaceduardo`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION

) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;

-- ============================================
-- PROCEDURE
-- ============================================

DELIMITER $$

CREATE PROCEDURE `validamaceduardo` (
    IN p_idmac VARCHAR(17),
    OUT p_ativo BOOLEAN,
    OUT p_contador INT,
    OUT p_limite INT
)
BEGIN

    SELECT
        ativo,
        contador,
        limite

    INTO
        p_ativo,
        p_contador,
        p_limite

    FROM maceduardo
    WHERE idmaceduardo = p_idmac;

END$$

DELIMITER ;

-- ============================================
-- TRIGGER - VALIDAR MAC ANTES DA LEITURA
-- ============================================

DELIMITER $$

CREATE TRIGGER `tgvalidamaceduardo`
BEFORE INSERT ON `leituraeduardo`
FOR EACH ROW

BEGIN

    DECLARE v_ativo BOOLEAN;
    DECLARE v_contador INT;
    DECLARE v_limite INT;

    CALL validamaceduardo(
        NEW.maceduardo_idmaceduardo,
        v_ativo,
        v_contador,
        v_limite
    );

    IF v_ativo = 0 THEN

        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'MAC INATIVO';

    END IF;

    IF v_contador >= v_limite THEN

        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'LIMITE DE LEITURAS ATINGIDO';

    END IF;

END$$

DELIMITER ;

-- ============================================
-- TRIGGER - AUMENTAR CONTADOR
-- ============================================

DELIMITER $$

CREATE TRIGGER `tginsertleituraeduardo`
AFTER INSERT ON `leituraeduardo`
FOR EACH ROW

BEGIN

    UPDATE maceduardo
    SET contador = contador + 1
    WHERE idmaceduardo = NEW.maceduardo_idmaceduardo;

END$$

DELIMITER ;

-- ============================================
-- TRIGGER - DIMINUIR CONTADOR
-- ============================================

DELIMITER $$

CREATE TRIGGER `tgdeleteleituraeduardo`
AFTER DELETE ON `leituraeduardo`
FOR EACH ROW

BEGIN

    UPDATE maceduardo
    SET contador =
        CASE
            WHEN contador > 0 THEN contador - 1
            ELSE 0
        END

    WHERE idmaceduardo = OLD.maceduardo_idmaceduardo;

END$$

DELIMITER ;