CREATE TABLE `discount`
(
    `id`               INT UNSIGNED  NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `name`             VARCHAR(255)  NOT NULL,
    `description`      TEXT          NOT NULL,
    `discount_percent` DECIMAL(8, 2) NOT NULL,
    `deleted_at`       INT(8)        NOT NULL,
    `modified_at`      INT(8)        NOT NULL,
    `created_at`       INT(8)        NOT NULL,
    `active`           BOOLEAN       NOT NULL
);
CREATE TABLE `user_address`
(
    `address_line1` VARCHAR(255) NOT NULL,
    `city`          VARCHAR(255) NOT NULL,
    `id`            INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `country`       VARCHAR(2)   NOT NULL,
    `user_id`       INT UNSIGNED NOT NULL,
    `mobile`        VARCHAR(255) NOT NULL,
    `postal_code`   INT          NOT NULL,
    `address_line2` VARCHAR(255) NOT NULL,
    `telephone`     VARCHAR(255) NOT NULL
);
ALTER TABLE
    `user_address`
    ADD UNIQUE `user_address_mobile_unique` (`mobile`);
ALTER TABLE
    `user_address`
    ADD UNIQUE `user_address_telephone_unique` (`telephone`);
CREATE TABLE `product_inventory`
(
    `created_at`  INT(8)       NOT NULL,
    `modified_at` INT(8)       NOT NULL,
    `quantity`    INT          NOT NULL,
    `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `deleted_at`  INT(8)       NOT NULL
);
CREATE TABLE `payment_details`
(
    `order_id`    INT          NOT NULL,
    `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `status`      VARCHAR(255) NOT NULL,
    `provider`    VARCHAR(255) NOT NULL,
    `modified_at` INT(8)       NOT NULL,
    `amount`      INT          NOT NULL,
    `created_at`  INT(8)       NOT NULL
);
CREATE TABLE `order_details`
(
    `payment_id`  INT UNSIGNED  NOT NULL,
    `total`       DECIMAL(8, 2) NOT NULL,
    `modified_at` INT(8)        NOT NULL,
    `created_at`  INT(8)        NOT NULL,
    `id`          INT UNSIGNED  NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `user_id`     INT UNSIGNED  NOT NULL
);
CREATE TABLE `order_items`
(
    `modified_at` INT(8)       NOT NULL,
    `user_id`     BIGINT       NOT NULL,
    `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `quantity`    INT          NOT NULL,
    `order_id`    INT UNSIGNED NOT NULL,
    `created_at`  INT(8)       NOT NULL,
    `product_id`  INT UNSIGNED NOT NULL
);
CREATE TABLE `user_payment`
(
    `id`           INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `provider`     VARCHAR(255) NOT NULL,
    `account_no`   VARCHAR(255) NOT NULL,
    `expiry`       DATE         NOT NULL,
    `payment_type` VARCHAR(255) NOT NULL,
    `user_id`      INT UNSIGNED NOT NULL
);
CREATE TABLE `product`
(
    `category_id`  INT UNSIGNED  NOT NULL,
    `model`        VARCHAR(255)  NOT NULL,
    `color`        VARCHAR(255)  NOT NULL,
    `engine`       VARCHAR(255)  NOT NULL,
    `description`  TEXT          NOT NULL,
    `make`         VARCHAR(255)  NOT NULL,
    `inventory_id` INT UNSIGNED  NOT NULL,
    `discount_id`  INT UNSIGNED  NOT NULL,
    `created_at`   INT(8)        NOT NULL,
    `name`         VARCHAR(255)  NOT NULL,
    `deleted_at`   INT(8)        NOT NULL,
    `id`           INT UNSIGNED  NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `modified_at`  INT(8)        NOT NULL,
    `price`        DECIMAL(8, 2) NOT NULL
);
CREATE TABLE `product_category`
(
    `created_at`  INT(8)       NOT NULL,
    `name`        VARCHAR(255) NOT NULL,
    `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `modified_at` INT(8)       NOT NULL,
    `desc`        TEXT         NOT NULL,
    `deleted_at`  INT(8)       NOT NULL
);
CREATE TABLE `user`
(
    `is_active`        BOOLEAN      NOT NULL DEFAULT '1',
    `lower_name`       VARCHAR(255) NOT NULL,
    `email`            VARCHAR(255) NOT NULL DEFAULT 'NONE',
    `passwd_hash_algo` VARCHAR(255) NOT NULL DEFAULT 'NONE',
    `modified_at`      INT(8)       NOT NULL DEFAULT '0',
    `is_admin`         BOOLEAN      NOT NULL DEFAULT '0',
    `name`             VARCHAR(255) NOT NULL,
    `id`               INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `created_at`       INT(8)       NOT NULL DEFAULT '0',
    `passwd`           VARCHAR(255) NOT NULL DEFAULT 'NONE'
);
ALTER TABLE
    `user`
    ADD UNIQUE `user_email_unique` (`email`);
CREATE TABLE `shopping_session`
(
    `id`          INT UNSIGNED  NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `created_at`  INT(8)        NOT NULL,
    `user_id`     INT UNSIGNED  NOT NULL,
    `modified_at` INT(8)        NOT NULL,
    `total`       DECIMAL(8, 2) NOT NULL
);
CREATE TABLE `cart_item`
(
    `product_id`  INT UNSIGNED NOT NULL,
    `session_id`  INT UNSIGNED NOT NULL,
    `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `created_at`  INT(8)       NOT NULL,
    `modified_at` INT(8)       NOT NULL,
    `quantity`    INT          NOT NULL
);
ALTER TABLE
    `product`
    ADD CONSTRAINT `product_inventory_id_foreign` FOREIGN KEY (`inventory_id`) REFERENCES `product_inventory` (`id`);
ALTER TABLE
    `order_items`
    ADD CONSTRAINT `order_items_order_id_foreign` FOREIGN KEY (`order_id`) REFERENCES `order_details` (`id`);
ALTER TABLE
    `product`
    ADD CONSTRAINT `product_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `product_category` (`id`);
ALTER TABLE
    `order_details`
    ADD CONSTRAINT `order_details_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`);
ALTER TABLE
    `cart_item`
    ADD CONSTRAINT `cart_item_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`);
ALTER TABLE
    `order_items`
    ADD CONSTRAINT `order_items_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`);
ALTER TABLE
    `user_address`
    ADD CONSTRAINT `user_address_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`);
ALTER TABLE
    `order_details`
    ADD CONSTRAINT `order_details_payment_id_foreign` FOREIGN KEY (`payment_id`) REFERENCES `payment_details` (`id`);
ALTER TABLE
    `product`
    ADD CONSTRAINT `product_discount_id_foreign` FOREIGN KEY (`discount_id`) REFERENCES `discount` (`id`);
ALTER TABLE
    `user_payment`
    ADD CONSTRAINT `user_payment_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`);
ALTER TABLE
    `shopping_session`
    ADD CONSTRAINT `shopping_session_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`);
ALTER TABLE
    `cart_item`
    ADD CONSTRAINT `cart_item_session_id_foreign` FOREIGN KEY (`session_id`) REFERENCES `shopping_session` (`id`);