/*
    MuShopping - Novo Schema
    Season 6 / SQL Server
    Todas as tabelas usam o prefixo Shop_ para não colidir com nada do MuOnline original.
*/

-- =========================================================
-- Catálogo de produtos (itens e kits), Gold e Cash no mesmo lugar
-- =========================================================
CREATE TABLE Shop_Products (
    ProductID       INT IDENTITY(1,1) PRIMARY KEY,
    Currency        VARCHAR(10)     NOT NULL DEFAULT 'GOLD',   -- 'GOLD' ou 'CASH'
    Name            NVARCHAR(100)   NOT NULL,
    Description     NVARCHAR(MAX)   NULL,
    Category        VARCHAR(50)     NOT NULL,                  -- Helms, Wings, Kits, Potions, etc.
    IsKit           BIT             NOT NULL DEFAULT 0,
    ImagePath       VARCHAR(255)    NULL,

    -- Identificação do item no jogo (Season 6)
    ItemIndex       INT             NOT NULL,   -- Index dentro da categoria (Item.txt)
    ItemSection     INT             NOT NULL,   -- Categoria/TP do item
    ItemWidth       TINYINT         NOT NULL DEFAULT 1,
    ItemHeight      TINYINT         NOT NULL DEFAULT 1,
    ItemDuration    INT             NOT NULL DEFAULT 255,      -- Durabilidade base

    -- Preço base + preços incrementais por atributo (mesma lógica do finishbuy.class.php original)
    BasePrice           BIGINT     NOT NULL DEFAULT 0,
    PricePerLevel        BIGINT    NOT NULL DEFAULT 0,
    PricePerOption        BIGINT   NOT NULL DEFAULT 0,
    PriceSkill              BIGINT NOT NULL DEFAULT 0,
    PriceLuck               BIGINT NOT NULL DEFAULT 0,
    PricePerExcOption      BIGINT  NOT NULL DEFAULT 0,
    PricePerAncientLevel    BIGINT NOT NULL DEFAULT 0,
    PriceHarmonyOption      BIGINT NOT NULL DEFAULT 0,
    PricePerRefineLevel     BIGINT NOT NULL DEFAULT 0,
    PricePerSocket           BIGINT NOT NULL DEFAULT 0,

    -- Regras de customização permitidas na compra
    AllowLevel        BIT   NOT NULL DEFAULT 0,
    MaxLevel           TINYINT NOT NULL DEFAULT 15,
    AllowOption        BIT   NOT NULL DEFAULT 0,
    AllowSkill         BIT   NOT NULL DEFAULT 0,
    AllowLuck          BIT   NOT NULL DEFAULT 0,
    AllowExcellent      BIT  NOT NULL DEFAULT 0,
    MaxExcellentOptions  TINYINT NOT NULL DEFAULT 0,
    AllowAncient        BIT  NOT NULL DEFAULT 0,
    AllowHarmony        BIT  NOT NULL DEFAULT 0,
    AllowRefine          BIT NOT NULL DEFAULT 0,
    AllowSocket           BIT NOT NULL DEFAULT 0,
    SocketCount            TINYINT NOT NULL DEFAULT 0,

    IsActive        BIT             NOT NULL DEFAULT 1,
    SortOrder       INT             NOT NULL DEFAULT 0,
    CreatedAt       DATETIME        NOT NULL DEFAULT GETDATE()
);
GO

-- =========================================================
-- Itens que compõem um Kit (quando IsKit = 1)
-- =========================================================
CREATE TABLE Shop_KitItems (
    KitItemID       INT IDENTITY(1,1) PRIMARY KEY,
    ProductID       INT NOT NULL FOREIGN KEY REFERENCES Shop_Products(ProductID) ON DELETE CASCADE,
    ItemIndex       INT NOT NULL,
    ItemSection     INT NOT NULL,
    ItemWidth       TINYINT NOT NULL DEFAULT 1,
    ItemHeight      TINYINT NOT NULL DEFAULT 1,
    ItemDuration    INT NOT NULL DEFAULT 255,
    ItemLevel       TINYINT NOT NULL DEFAULT 0,
    ItemOption      TINYINT NOT NULL DEFAULT 0,
    ItemAncient     TINYINT NOT NULL DEFAULT 0,
    ItemSkill       BIT NOT NULL DEFAULT 0,
    ItemLuck        BIT NOT NULL DEFAULT 0,
    ItemExcFlags    TINYINT NOT NULL DEFAULT 0,  -- bitmask das 6 opções excelentes
    Quantity        INT NOT NULL DEFAULT 1
);
GO

-- =========================================================
-- Cupons de desconto
-- =========================================================
CREATE TABLE Shop_Coupons (
    CouponID        INT IDENTITY(1,1) PRIMARY KEY,
    Code            VARCHAR(50) NOT NULL UNIQUE,
    DiscountPercent DECIMAL(5,2) NOT NULL,
    Currency        VARCHAR(10) NOT NULL DEFAULT 'ALL',   -- 'GOLD', 'CASH' ou 'ALL'
    MaxUses         INT NULL,                              -- NULL = ilimitado
    UsesCount       INT NOT NULL DEFAULT 0,
    ExpiresAt       DATETIME NULL,
    IsActive        BIT NOT NULL DEFAULT 1,
    CreatedAt       DATETIME NOT NULL DEFAULT GETDATE()
);
GO

-- =========================================================
-- Histórico de pedidos (cada compra gera 1 linha aqui)
-- =========================================================
CREATE TABLE Shop_Orders (
    OrderID         BIGINT IDENTITY(1,1) PRIMARY KEY,
    AccountID       VARCHAR(20) NOT NULL,
    ProductID       INT NOT NULL FOREIGN KEY REFERENCES Shop_Products(ProductID),
    Currency        VARCHAR(10) NOT NULL,
    Quantity        INT NOT NULL DEFAULT 1,
    UnitPrice       BIGINT NOT NULL,
    TotalPrice      BIGINT NOT NULL,
    CouponID        INT NULL FOREIGN KEY REFERENCES Shop_Coupons(CouponID),

    -- Snapshot dos atributos escolhidos na compra (pra recuperação de item perdido)
    ItemLevel       TINYINT NULL,
    ItemOption      TINYINT NULL,
    ItemAncient     TINYINT NULL,
    ItemSkill       BIT NULL,
    ItemLuck        BIT NULL,
    ItemExcFlags    TINYINT NULL,
    ItemHarmonyOption VARCHAR(10) NULL,
    ItemRefineLevel TINYINT NULL,
    ItemSocketData  VARCHAR(50) NULL,
    HexDelivered    VARCHAR(64) NULL,   -- bytes exatos gravados no baú, para auditoria/recuperação

    Status          VARCHAR(20) NOT NULL DEFAULT 'COMPLETED', -- COMPLETED, RECOVERED, FAILED
    RecoveredCount  INT NOT NULL DEFAULT 0,
    IPAddress       VARCHAR(45) NULL,
    CreatedAt       DATETIME NOT NULL DEFAULT GETDATE()
);
GO
CREATE INDEX IX_Shop_Orders_AccountID ON Shop_Orders(AccountID);
GO

-- =========================================================
-- Log de uso de cupom por conta (evita reuso indevido por conta)
-- =========================================================
CREATE TABLE Shop_CouponUses (
    CouponUseID     INT IDENTITY(1,1) PRIMARY KEY,
    CouponID        INT NOT NULL FOREIGN KEY REFERENCES Shop_Coupons(CouponID),
    AccountID       VARCHAR(20) NOT NULL,
    OrderID         BIGINT NULL FOREIGN KEY REFERENCES Shop_Orders(OrderID),
    UsedAt          DATETIME NOT NULL DEFAULT GETDATE()
);
GO

-- =========================================================
-- Log de segurança / auditoria (substitui os logs em arquivo .txt do original)
-- =========================================================
CREATE TABLE Shop_AuditLog (
    LogID           BIGINT IDENTITY(1,1) PRIMARY KEY,
    AccountID       VARCHAR(20) NULL,
    Action          VARCHAR(50) NOT NULL,   -- LOGIN, PURCHASE, RECOVER_ITEM, REPAIR_ITEM, ADMIN_EDIT...
    Details         NVARCHAR(MAX) NULL,
    IPAddress       VARCHAR(45) NULL,
    CreatedAt       DATETIME NOT NULL DEFAULT GETDATE()
);
GO

-- =========================================================
-- Definições de TODOS os itens do jogo (importar do Item.txt)
-- Necessário para calcular corretamente espaço livre no baú:
-- sem saber a largura/altura de itens que já estão lá (mesmo os que
-- o shop nunca vendeu), corremos risco de sobrescrever item existente.
-- =========================================================
CREATE TABLE GameItemDefinitions (
    Category    TINYINT NOT NULL,
    ItemIndex_  SMALLINT NOT NULL,   -- "ItemIndex" é palavra reservada em alguns contextos, por isso o _
    Name        NVARCHAR(100) NOT NULL,
    Width       TINYINT NOT NULL DEFAULT 1,
    Height      TINYINT NOT NULL DEFAULT 1,
    MaxDurability SMALLINT NOT NULL DEFAULT 255,
    PRIMARY KEY (Category, ItemIndex_)
);
GO

-- =========================================================
-- Usuários administradores do painel (separado da conta de jogo)
-- =========================================================
CREATE TABLE Shop_AdminUsers (
    AdminID         INT IDENTITY(1,1) PRIMARY KEY,
    Username        VARCHAR(50) NOT NULL UNIQUE,
    PasswordHash    VARCHAR(255) NOT NULL,   -- password_hash() do PHP, nunca MD5
    IsActive        BIT NOT NULL DEFAULT 1,
    CreatedAt       DATETIME NOT NULL DEFAULT GETDATE()
);
GO
