-- =====================================================================
-- Ideart ERP — Setup completo e idempotente do banco de dados
-- =====================================================================
-- Este script cria TODO o schema necessário para rodar o sistema
-- (tabelas, índices, usuários iniciais e configuração da empresa).
--
-- É idempotente: pode ser executado várias vezes no mesmo banco
-- sem quebrar nada. Também migra bancos criados em versões anteriores
-- (adiciona colunas novas, ajusta ENUMs e índices).
--
-- Uso:
--   1) Crie o banco (uma vez):
--        mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS ideart_erp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
--   2) Execute este arquivo:
--        mysql -u root -p ideart_erp < setup.sql
--   3) (Opcional) Popule dados fictícios:
--        mysql -u root -p ideart_erp < setup-dados-exemplo.sql
-- =====================================================================

USE ideart_erp;

-- =====================================================================
-- 1. TABELAS PRINCIPAIS
-- =====================================================================

CREATE TABLE IF NOT EXISTS clientes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE,
    telefone VARCHAR(20),
    endereco VARCHAR(255),
    cidade VARCHAR(100),
    estado VARCHAR(2),
    cep VARCHAR(8),
    data_cadastro TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS profissionais (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(255) NOT NULL,
    especialidade VARCHAR(100),
    email VARCHAR(255) UNIQUE,
    telefone VARCHAR(20),
    cpf VARCHAR(11) UNIQUE,
    data_admissao DATE,
    salario DECIMAL(10, 2),
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS produtos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(255) NOT NULL,
    descricao TEXT,
    categoria VARCHAR(100),
    preco_custo DECIMAL(10, 2),
    preco_venda DECIMAL(10, 2) NOT NULL,
    estoque INT DEFAULT 0,
    sku VARCHAR(100),
    fornecedor VARCHAR(255),
    ativo BOOLEAN DEFAULT TRUE,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_produtos_sku (sku)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS orcamentos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    numero VARCHAR(50) UNIQUE,
    cliente_id INT NOT NULL,
    profissional_id INT NULL,
    data_criacao DATE,
    data_validade DATE,
    valor_total DECIMAL(12, 2),
    desconto DECIMAL(10, 2) DEFAULT 0,
    status ENUM('pendente', 'aprovado', 'recusado', 'expirado', 'convertido') DEFAULT 'pendente',
    observacoes TEXT,
    forma_pagamento VARCHAR(50) NULL,
    assinatura VARCHAR(255) NULL,
    pedido_id INT NULL,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS orcamento_itens (
    id INT PRIMARY KEY AUTO_INCREMENT,
    orcamento_id INT NOT NULL,
    ambiente VARCHAR(100) NULL,
    produto_id INT NULL,
    nome_customizado VARCHAR(255) NULL,
    codigo_customizado VARCHAR(100) NULL,
    descricao_customizada TEXT NULL,
    tamanho VARCHAR(100) NULL,
    cor VARCHAR(100) NULL,
    quantidade INT,
    preco_unitario DECIMAL(10, 2),
    subtotal DECIMAL(12, 2),
    ordem INT DEFAULT 0,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (orcamento_id) REFERENCES orcamentos(id),
    FOREIGN KEY (produto_id) REFERENCES produtos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS pedidos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    numero VARCHAR(50) UNIQUE,
    cliente_id INT NOT NULL,
    orcamento_id INT NULL,
    data_pedido DATE,
    data_entrega_prevista DATE,
    data_entrega_real DATE,
    valor_total DECIMAL(12, 2),
    desconto DECIMAL(10, 2) DEFAULT 0,
    status ENUM('pendente', 'processando', 'enviado', 'entregue', 'cancelado') DEFAULT 'pendente',
    observacoes TEXT,
    forma_pagamento VARCHAR(50) NULL,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS pedido_itens (
    id INT PRIMARY KEY AUTO_INCREMENT,
    pedido_id INT NOT NULL,
    ambiente VARCHAR(100) NULL,
    produto_id INT NULL,
    nome_customizado VARCHAR(255) NULL,
    codigo_customizado VARCHAR(100) NULL,
    descricao_customizada TEXT NULL,
    tamanho VARCHAR(100) NULL,
    cor VARCHAR(100) NULL,
    quantidade INT,
    preco_unitario DECIMAL(10, 2),
    subtotal DECIMAL(12, 2),
    ordem INT DEFAULT 0,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (pedido_id) REFERENCES pedidos(id),
    FOREIGN KEY (produto_id) REFERENCES produtos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS logistica (
    id INT PRIMARY KEY AUTO_INCREMENT,
    numero_rastreamento VARCHAR(100) UNIQUE,
    pedido_id INT NOT NULL,
    transportadora VARCHAR(100),
    endereco_origem VARCHAR(255),
    endereco_destino VARCHAR(255),
    data_envio DATE,
    data_entrega_prevista DATE,
    data_entrega_real DATE,
    status ENUM('aguardando', 'emtrancito', 'saiu_entrega', 'entregue', 'problema') DEFAULT 'aguardando',
    observacoes TEXT,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (pedido_id) REFERENCES pedidos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS documentos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(255) NOT NULL,
    tipo VARCHAR(50),
    referencia_id INT,
    referencia_tipo VARCHAR(50),
    caminho_arquivo VARCHAR(255),
    data_criacao DATE,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS empresa_config (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome_fantasia VARCHAR(255) NOT NULL,
    razao_social VARCHAR(255),
    cnpj VARCHAR(20),
    email VARCHAR(255),
    telefone VARCHAR(20),
    endereco VARCHAR(255),
    cidade VARCHAR(100),
    estado VARCHAR(2),
    logo_url VARCHAR(500),
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS logs_acesso (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT,
    acao VARCHAR(100) NOT NULL,
    descricao TEXT,
    ip_endereco VARCHAR(45),
    user_agent TEXT,
    resultado ENUM('sucesso', 'falha') DEFAULT 'sucesso',
    data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE SET NULL,
    INDEX idx_usuario_id (usuario_id),
    INDEX idx_resultado (resultado),
    INDEX idx_data_criacao (data_criacao)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Log de acessos e ações do sistema';

CREATE TABLE IF NOT EXISTS filtros_salvos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    contexto VARCHAR(100) NOT NULL,
    nome VARCHAR(150) NOT NULL,
    valores JSON NOT NULL,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_filtros_contexto_nome (contexto, nome),
    INDEX idx_contexto (contexto)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Conjuntos de filtros nomeados, compartilhados entre todos os usuários';
SET @sql := IF(@existe = 0,
    'ALTER TABLE produtos ADD COLUMN fornecedor VARCHAR(255) AFTER sku',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@uk_legado > 0,
    'ALTER TABLE produtos DROP INDEX sku',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@uk_composto > 0,
    'ALTER TABLE produtos DROP INDEX uk_produtos_sku_fornecedor',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@uk_novo = 0,
    'ALTER TABLE produtos ADD UNIQUE KEY uk_produtos_sku (sku)',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamentos ADD COLUMN profissional_id INT NULL AFTER cliente_id',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamentos ADD COLUMN forma_pagamento VARCHAR(50) NULL AFTER observacoes',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamentos ADD COLUMN assinatura VARCHAR(255) NULL AFTER forma_pagamento',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamentos ADD COLUMN pedido_id INT NULL AFTER assinatura',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- 3.4 orcamentos.status — garantir ENUM atualizado (ignora erro caso já esteja)
ALTER TABLE orcamentos
    MODIFY COLUMN status ENUM('pendente','aprovado','recusado','expirado','convertido') DEFAULT 'pendente';
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamento_itens ADD COLUMN nome_customizado VARCHAR(255) NULL AFTER produto_id',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamento_itens ADD COLUMN descricao_customizada TEXT NULL AFTER nome_customizado',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamento_itens ADD COLUMN ordem INT DEFAULT 0 AFTER subtotal',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

ALTER TABLE orcamento_itens MODIFY COLUMN produto_id INT NULL;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamento_itens ADD COLUMN ambiente VARCHAR(100) NULL AFTER orcamento_id',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamento_itens ADD COLUMN codigo_customizado VARCHAR(100) NULL AFTER nome_customizado',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamento_itens ADD COLUMN tamanho VARCHAR(100) NULL AFTER descricao_customizada',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE orcamento_itens ADD COLUMN cor VARCHAR(100) NULL AFTER tamanho',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedidos ADD COLUMN orcamento_id INT NULL AFTER cliente_id',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedidos ADD COLUMN forma_pagamento VARCHAR(50) NULL AFTER observacoes',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedido_itens ADD COLUMN nome_customizado VARCHAR(255) NULL AFTER produto_id',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedido_itens ADD COLUMN descricao_customizada TEXT NULL AFTER nome_customizado',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedido_itens ADD COLUMN ordem INT DEFAULT 0 AFTER subtotal',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

ALTER TABLE pedido_itens MODIFY COLUMN produto_id INT NULL;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedido_itens ADD COLUMN ambiente VARCHAR(100) NULL AFTER pedido_id',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedido_itens ADD COLUMN codigo_customizado VARCHAR(100) NULL AFTER nome_customizado',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedido_itens ADD COLUMN tamanho VARCHAR(100) NULL AFTER descricao_customizada',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0,
    'ALTER TABLE pedido_itens ADD COLUMN cor VARCHAR(100) NULL AFTER tamanho',
    'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_cliente_email ON clientes(email)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_produto_categoria ON produtos(categoria)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_orcamento_cliente ON orcamentos(cliente_id)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_pedido_cliente ON pedidos(cliente_id)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_logistica_pedido ON logistica(pedido_id)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_orcamento_itens_orcamento ON orcamento_itens(orcamento_id)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_pedido_itens_pedido ON pedido_itens(pedido_id)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_username_ativo ON usuarios(username, ativo)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF(@existe = 0, 'CREATE INDEX idx_email_ativo ON usuarios(email, ativo)', 'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- =====================================================================
-- 5. SEEDS
-- =====================================================================

-- 5.1 empresa_config — registro padrão (só insere se tabela estiver vazia)
INSERT INTO empresa_config (nome_fantasia, razao_social, email, telefone, endereco, cidade, estado)
SELECT 'Ideart', 'Ideart Comércio Ltda.', 'contato@ideart.com.br', '(11) 0000-0000',
       'Endereço da empresa', 'São Paulo', 'SP'
WHERE NOT EXISTS (SELECT 1 FROM empresa_config);
