-- ============================================
-- SCHEMA ERP VERDE PACK CANTONEIRAS
-- Supabase PostgreSQL
-- ============================================

-- Extensões necessárias
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- ============================================
-- 1. TABELA: categorias
-- ============================================
CREATE TABLE IF NOT EXISTS categorias (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nome VARCHAR(100) NOT NULL,
    tipo VARCHAR(20) NOT NULL CHECK (tipo IN ('fabricado', 'revenda')),
    ativo BOOLEAN DEFAULT true,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- ============================================
-- 2. TABELA: fornecedores
-- ============================================
CREATE TABLE IF NOT EXISTS fornecedores (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    razao_social VARCHAR(255) NOT NULL,
    nome_fantasia VARCHAR(255),
    cnpj VARCHAR(18) UNIQUE,
    email VARCHAR(255),
    telefone VARCHAR(20),
    celular VARCHAR(20),
    endereco_completo TEXT,
    cep VARCHAR(10),
    cidade VARCHAR(100),
    estado VARCHAR(2),
    condicoes_pagamento TEXT,
    prazo_entrega_dias INTEGER,
    observacoes TEXT,
    ativo BOOLEAN DEFAULT true,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- ============================================
-- 3. TABELA: materias_primas
-- ============================================
CREATE TABLE IF NOT EXISTS materias_primas (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nome VARCHAR(255) NOT NULL,
    tipo VARCHAR(50) NOT NULL,
    
    -- Específico para bobinas de papel
    gramatura DECIMAL(10,2), -- g/m²
    largura_mm DECIMAL(10,2), -- mm
    peso_por_metro_g DECIMAL(10,3), -- calculado: (gramatura × largura_mm) / 1000
    
    -- Controle de estoque
    unidade_estoque VARCHAR(20) NOT NULL, -- kg, litro, unidade
    estoque_atual DECIMAL(10,3) DEFAULT 0,
    estoque_minimo DECIMAL(10,3) DEFAULT 0,
    estoque_ponto_reposicao DECIMAL(10,3) DEFAULT 0,
    
    -- Custos
    custo_por_unidade DECIMAL(10,2) NOT NULL, -- R$ por kg, litro, etc
    
    -- Fornecedor
    fornecedor_id UUID REFERENCES fornecedores(id),
    
    -- Armazenamento
    local_armazenamento VARCHAR(100),
    
    ativo BOOLEAN DEFAULT true,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Trigger para calcular peso_por_metro_g automaticamente
CREATE OR REPLACE FUNCTION calcular_peso_por_metro()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.gramatura IS NOT NULL AND NEW.largura_mm IS NOT NULL THEN
        NEW.peso_por_metro_g := (NEW.gramatura * NEW.largura_mm) / 1000;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_calcular_peso_por_metro
BEFORE INSERT OR UPDATE ON materias_primas
FOR EACH ROW
EXECUTE FUNCTION calcular_peso_por_metro();

-- ============================================
-- 4. TABELA: produtos
-- ============================================
CREATE TABLE IF NOT EXISTS produtos (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nome VARCHAR(255) NOT NULL,
    codigo_interno VARCHAR(50),
    descricao TEXT,
    categoria_id UUID REFERENCES categorias(id),
    tipo VARCHAR(20) NOT NULL CHECK (tipo IN ('fabricado', 'revenda')),
    
    -- Dimensões (em mm - para produtos fabricados)
    altura_mm DECIMAL(10,2),
    largura_mm DECIMAL(10,2),
    espessura_mm DECIMAL(10,2),
    
    -- Venda
    unidade_venda VARCHAR(20) NOT NULL, -- metro, kg, unidade, rolo
    permite_medida_composta BOOLEAN DEFAULT false,
    preco_venda_unitario DECIMAL(10,2) NOT NULL,
    margem_lucro_percentual DECIMAL(10,2),
    
    -- Específico para REVENDA
    estoque_atual DECIMAL(10,2),
    estoque_minimo DECIMAL(10,2),
    estoque_ponto_reposicao DECIMAL(10,2),
    custo_compra DECIMAL(10,2),
    fornecedor_id UUID REFERENCES fornecedores(id),
    codigo_fornecedor VARCHAR(50),
    lote_minimo_compra INTEGER,
    prazo_entrega_dias INTEGER,
    local_armazenamento VARCHAR(100),
    
    -- Específico para FABRICADO
    tempo_producao_metros_hora DECIMAL(10,2),
    lead_time_dias INTEGER,
    instrucoes_tecnicas TEXT,
    
    ativo BOOLEAN DEFAULT true,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- ============================================
-- 5. TABELA: receitas (composição de produtos fabricados)
-- ============================================
CREATE TABLE IF NOT EXISTS receitas (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    produto_id UUID REFERENCES produtos(id) ON DELETE CASCADE,
    materia_prima_id UUID REFERENCES materias_primas(id),
    numero_camadas INTEGER DEFAULT 1,
    consumo_por_metro_g DECIMAL(10,3) NOT NULL, -- gramas por metro linear
    custo_por_metro DECIMAL(10,2), -- calculado automaticamente
    observacoes TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    
    UNIQUE(produto_id, materia_prima_id)
);

-- Trigger para calcular consumo e custo automaticamente
CREATE OR REPLACE FUNCTION calcular_consumo_receita()
RETURNS TRIGGER AS $$
DECLARE
    peso_metro DECIMAL(10,3);
    custo_kg DECIMAL(10,2);
BEGIN
    -- Buscar peso por metro e custo da matéria-prima
    SELECT peso_por_metro_g, custo_por_unidade
    INTO peso_metro, custo_kg
    FROM materias_primas
    WHERE id = NEW.materia_prima_id;
    
    -- Calcular consumo por metro
    IF peso_metro IS NOT NULL AND NEW.numero_camadas IS NOT NULL THEN
        NEW.consumo_por_metro_g := peso_metro * NEW.numero_camadas;
    END IF;
    
    -- Calcular custo por metro
    IF NEW.consumo_por_metro_g IS NOT NULL AND custo_kg IS NOT NULL THEN
        NEW.custo_por_metro := (NEW.consumo_por_metro_g / 1000) * custo_kg;
    END IF;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_calcular_consumo_receita
BEFORE INSERT OR UPDATE ON receitas
FOR EACH ROW
EXECUTE FUNCTION calcular_consumo_receita();

-- ============================================
-- 6. TABELA: clientes
-- ============================================
CREATE TABLE IF NOT EXISTS clientes (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tipo_pessoa VARCHAR(10) NOT NULL CHECK (tipo_pessoa IN ('fisica', 'juridica')),
    razao_social VARCHAR(255) NOT NULL, -- ou nome completo
    nome_fantasia VARCHAR(255),
    cnpj_cpf VARCHAR(18),
    email VARCHAR(255),
    telefone VARCHAR(20),
    celular VARCHAR(20),
    endereco_completo TEXT,
    cep VARCHAR(10),
    cidade VARCHAR(100),
    estado VARCHAR(2),
    contato_principal VARCHAR(100),
    condicoes_pagamento TEXT,
    limite_credito DECIMAL(10,2),
    observacoes TEXT,
    ativo BOOLEAN DEFAULT true,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- ============================================
-- 7. TABELA: pedidos
-- ============================================
CREATE TABLE IF NOT EXISTS pedidos (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    numero_pedido VARCHAR(20) UNIQUE NOT NULL,
    cliente_id UUID REFERENCES clientes(id),
    data_pedido DATE NOT NULL DEFAULT CURRENT_DATE,
    tipo VARCHAR(20) NOT NULL CHECK (tipo IN ('orcamento', 'pedido_confirmado')),
    status VARCHAR(20) NOT NULL DEFAULT 'orcamento' 
        CHECK (status IN ('orcamento', 'aprovado', 'producao', 'finalizado', 'entregue', 'cancelado')),
    
    -- Valores
    valor_produtos DECIMAL(10,2) DEFAULT 0,
    valor_frete DECIMAL(10,2) DEFAULT 0,
    valor_desconto DECIMAL(10,2) DEFAULT 0,
    valor_total DECIMAL(10,2) DEFAULT 0,
    
    -- Prazos
    prazo_entrega_dias INTEGER,
    data_entrega_prevista DATE,
    data_entrega_realizada DATE,
    
    -- Pagamento
    forma_pagamento VARCHAR(50),
    condicoes_pagamento TEXT,
    
    -- Observações
    observacoes TEXT,
    observacoes_internas TEXT,
    
    -- Auditoria
    vendedor_id UUID, -- pode referenciar tabela de usuários
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Função para gerar número de pedido sequencial
CREATE SEQUENCE IF NOT EXISTS pedido_numero_seq START 1;

CREATE OR REPLACE FUNCTION gerar_numero_pedido()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.numero_pedido IS NULL THEN
        NEW.numero_pedido := LPAD(nextval('pedido_numero_seq')::TEXT, 4, '0');
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_gerar_numero_pedido
BEFORE INSERT ON pedidos
FOR EACH ROW
EXECUTE FUNCTION gerar_numero_pedido();

-- ============================================
-- 8. TABELA: pedidos_itens
-- ============================================
CREATE TABLE IF NOT EXISTS pedidos_itens (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    pedido_id UUID REFERENCES pedidos(id) ON DELETE CASCADE,
    produto_id UUID REFERENCES produtos(id),
    tipo_produto VARCHAR(20) NOT NULL CHECK (tipo_produto IN ('fabricado', 'revenda')),
    
    -- Para venda composta (produtos fabricados)
    quantidade_pecas INTEGER,
    comprimento_cada_mm DECIMAL(10,2),
    total_calculado DECIMAL(10,3), -- quantidade × comprimento / 1000 = metros
    
    -- Para venda simples (produtos revenda)
    quantidade_simples DECIMAL(10,2),
    
    -- Valores
    unidade_medida VARCHAR(20) NOT NULL,
    preco_unitario DECIMAL(10,2) NOT NULL,
    subtotal DECIMAL(10,2) NOT NULL,
    
    observacoes TEXT,
    
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Trigger para calcular total e subtotal automaticamente
CREATE OR REPLACE FUNCTION calcular_item_pedido()
RETURNS TRIGGER AS $$
BEGIN
    -- Se é venda composta (fabricado)
    IF NEW.quantidade_pecas IS NOT NULL AND NEW.comprimento_cada_mm IS NOT NULL THEN
        NEW.total_calculado := (NEW.quantidade_pecas * NEW.comprimento_cada_mm) / 1000.0;
        NEW.subtotal := NEW.total_calculado * NEW.preco_unitario;
    -- Se é venda simples (revenda)
    ELSIF NEW.quantidade_simples IS NOT NULL THEN
        NEW.subtotal := NEW.quantidade_simples * NEW.preco_unitario;
    END IF;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_calcular_item_pedido
BEFORE INSERT OR UPDATE ON pedidos_itens
FOR EACH ROW
EXECUTE FUNCTION calcular_item_pedido();

-- Trigger para atualizar valores do pedido
CREATE OR REPLACE FUNCTION atualizar_valores_pedido()
RETURNS TRIGGER AS $$
BEGIN
    UPDATE pedidos
    SET 
        valor_produtos = (
            SELECT COALESCE(SUM(subtotal), 0)
            FROM pedidos_itens
            WHERE pedido_id = COALESCE(NEW.pedido_id, OLD.pedido_id)
        ),
        valor_total = (
            SELECT COALESCE(SUM(subtotal), 0) + COALESCE(valor_frete, 0) - COALESCE(valor_desconto, 0)
            FROM pedidos_itens
            WHERE pedido_id = COALESCE(NEW.pedido_id, OLD.pedido_id)
        ),
        updated_at = NOW()
    WHERE id = COALESCE(NEW.pedido_id, OLD.pedido_id);
    
    RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_atualizar_valores_pedido
AFTER INSERT OR UPDATE OR DELETE ON pedidos_itens
FOR EACH ROW
EXECUTE FUNCTION atualizar_valores_pedido();

-- ============================================
-- 9. TABELA: ordens_producao
-- ============================================
CREATE TABLE IF NOT EXISTS ordens_producao (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    numero_op VARCHAR(20) UNIQUE NOT NULL,
    pedido_id UUID REFERENCES pedidos(id),
    pedido_item_id UUID REFERENCES pedidos_itens(id),
    produto_id UUID REFERENCES produtos(id),
    
    quantidade_produzir_metros DECIMAL(10,2) NOT NULL,
    
    data_programada DATE,
    data_inicio_producao TIMESTAMP WITH TIME ZONE,
    data_conclusao TIMESTAMP WITH TIME ZONE,
    
    status VARCHAR(20) NOT NULL DEFAULT 'aguardando'
        CHECK (status IN ('aguardando', 'em_producao', 'concluido', 'cancelado')),
    
    instrucoes_tecnicas TEXT,
    observacoes TEXT,
    
    responsavel_producao VARCHAR(100),
    
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Função para gerar número de OP sequencial
CREATE SEQUENCE IF NOT EXISTS op_numero_seq START 1;

CREATE OR REPLACE FUNCTION gerar_numero_op()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.numero_op IS NULL THEN
        NEW.numero_op := 'OP-' || LPAD(nextval('op_numero_seq')::TEXT, 4, '0');
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_gerar_numero_op
BEFORE INSERT ON ordens_producao
FOR EACH ROW
EXECUTE FUNCTION gerar_numero_op();

-- ============================================
-- 10. TABELA: ordens_producao_consumo
-- ============================================
CREATE TABLE IF NOT EXISTS ordens_producao_consumo (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    ordem_producao_id UUID REFERENCES ordens_producao(id) ON DELETE CASCADE,
    materia_prima_id UUID REFERENCES materias_primas(id),
    
    quantidade_prevista_kg DECIMAL(10,3) NOT NULL,
    quantidade_consumida_kg DECIMAL(10,3), -- preenchido após produção
    diferenca_kg DECIMAL(10,3), -- desperdício/economia
    
    observacoes TEXT,
    
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Trigger para calcular diferença automaticamente
CREATE OR REPLACE FUNCTION calcular_diferenca_consumo()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.quantidade_consumida_kg IS NOT NULL THEN
        NEW.diferenca_kg := NEW.quantidade_consumida_kg - NEW.quantidade_prevista_kg;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_calcular_diferenca_consumo
BEFORE INSERT OR UPDATE ON ordens_producao_consumo
FOR EACH ROW
EXECUTE FUNCTION calcular_diferenca_consumo();

-- ============================================
-- 11. TABELA: movimentacoes_estoque
-- ============================================
CREATE TABLE IF NOT EXISTS movimentacoes_estoque (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tipo VARCHAR(20) NOT NULL CHECK (tipo IN ('entrada', 'saida', 'ajuste', 'producao')),
    tipo_item VARCHAR(20) NOT NULL CHECK (tipo_item IN ('materia_prima', 'produto_revenda')),
    item_id UUID NOT NULL, -- id da matéria-prima ou produto
    
    quantidade_anterior DECIMAL(10,3),
    quantidade_movimentada DECIMAL(10,3) NOT NULL,
    quantidade_atual DECIMAL(10,3),
    unidade VARCHAR(20) NOT NULL,
    
    motivo VARCHAR(50) NOT NULL, -- compra, venda, producao, ajuste_inventario, devolucao
    documento_referencia VARCHAR(50), -- pedido_id, ordem_producao_id, nota_fiscal
    observacoes TEXT,
    
    usuario_id UUID, -- quem realizou a movimentação
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Índices para melhor performance
CREATE INDEX idx_movimentacoes_item ON movimentacoes_estoque(tipo_item, item_id);
CREATE INDEX idx_movimentacoes_data ON movimentacoes_estoque(created_at);

-- ============================================
-- VIEWS ÚTEIS
-- ============================================

-- View: Produtos com custo calculado
CREATE OR REPLACE VIEW view_produtos_com_custo AS
SELECT 
    p.*,
    COALESCE(SUM(r.custo_por_metro), 0) as custo_total_por_metro,
    CASE 
        WHEN p.tipo = 'fabricado' THEN 
            ROUND(((p.preco_venda_unitario - COALESCE(SUM(r.custo_por_metro), 0)) / NULLIF(COALESCE(SUM(r.custo_por_metro), 0), 0)) * 100, 2)
        ELSE 
            ROUND(((p.preco_venda_unitario - COALESCE(p.custo_compra, 0)) / NULLIF(COALESCE(p.custo_compra, 0), 0)) * 100, 2)
    END as margem_real_percentual
FROM produtos p
LEFT JOIN receitas r ON p.id = r.produto_id
GROUP BY p.id;

-- View: Alertas de estoque
CREATE OR REPLACE VIEW view_alertas_estoque AS
SELECT 
    'materia_prima' as tipo_item,
    mp.id,
    mp.nome,
    mp.estoque_atual,
    mp.estoque_minimo,
    mp.unidade_estoque,
    CASE 
        WHEN mp.estoque_atual <= mp.estoque_ponto_reposicao THEN 'critico'
        WHEN mp.estoque_atual <= mp.estoque_minimo THEN 'baixo'
        ELSE 'normal'
    END as nivel_alerta
FROM materias_primas mp
WHERE mp.ativo = true AND mp.estoque_atual <= mp.estoque_minimo

UNION ALL

SELECT 
    'produto_revenda' as tipo_item,
    p.id,
    p.nome,
    p.estoque_atual,
    p.estoque_minimo,
    p.unidade_venda,
    CASE 
        WHEN p.estoque_atual <= p.estoque_ponto_reposicao THEN 'critico'
        WHEN p.estoque_atual <= p.estoque_minimo THEN 'baixo'
        ELSE 'normal'
    END as nivel_alerta
FROM produtos p
WHERE p.tipo = 'revenda' AND p.ativo = true AND p.estoque_atual <= p.estoque_minimo;

-- ============================================
-- DADOS DE EXEMPLO
-- ============================================

-- Categorias
INSERT INTO categorias (nome, tipo) VALUES
('Cantoneiras', 'fabricado'),
('Embalagens', 'revenda'),
('Adesivos', 'revenda'),
('Filmes', 'revenda');

-- Fornecedores
INSERT INTO fornecedores (razao_social, nome_fantasia, cnpj, telefone) VALUES
('Papelaria Industrial Ltda', 'Papelaria XYZ', '12.345.678/0001-90', '(19) 3234-5678'),
('Distribuidora ABC S.A.', 'Distribuidora ABC', '98.765.432/0001-10', '(19) 3456-7890');

-- Matérias-Primas
INSERT INTO materias_primas (nome, tipo, gramatura, largura_mm, unidade_estoque, estoque_atual, estoque_minimo, custo_por_unidade, fornecedor_id) 
SELECT 
    'Bobina Kraft 400g - Largura 70mm',
    'papel_kraft',
    400,
    70,
    'kg',
    35,
    50,
    12.00,
    id
FROM fornecedores WHERE nome_fantasia = 'Papelaria XYZ' LIMIT 1;

INSERT INTO materias_primas (nome, tipo, gramatura, largura_mm, unidade_estoque, estoque_atual, estoque_minimo, custo_por_unidade, fornecedor_id) 
SELECT 
    'Bobina Kraft 130g - Largura 160mm',
    'papel_kraft',
    130,
    160,
    'kg',
    80,
    30,
    10.00,
    id
FROM fornecedores WHERE nome_fantasia = 'Papelaria XYZ' LIMIT 1;

INSERT INTO materias_primas (nome, tipo, unidade_estoque, estoque_atual, estoque_minimo, custo_por_unidade, fornecedor_id) 
SELECT 
    'Cola PVA Industrial',
    'cola',
    'kg',
    1.2,
    5,
    30.00,
    id
FROM fornecedores WHERE nome_fantasia = 'Distribuidora ABC' LIMIT 1;

-- Produtos Fabricados
INSERT INTO produtos (nome, codigo_interno, tipo, altura_mm, largura_mm, espessura_mm, unidade_venda, permite_medida_composta, preco_venda_unitario, lead_time_dias, categoria_id)
SELECT 
    'Cantoneira 50x50x3mm',
    'CANT-50-50-3',
    'fabricado',
    50,
    50,
    3,
    'metro',
    true,
    8.00,
    2,
    id
FROM categorias WHERE nome = 'Cantoneiras' LIMIT 1;

INSERT INTO produtos (nome, codigo_interno, tipo, altura_mm, largura_mm, espessura_mm, unidade_venda, permite_medida_composta, preco_venda_unitario, lead_time_dias, categoria_id)
SELECT 
    'Cantoneira 100x100x5mm',
    'CANT-100-100-5',
    'fabricado',
    100,
    100,
    5,
    'metro',
    true,
    15.00,
    2,
    id
FROM categorias WHERE nome = 'Cantoneiras' LIMIT 1;

-- Receitas (Composição)
-- Cantoneira 50x50x3mm
INSERT INTO receitas (produto_id, materia_prima_id, numero_camadas)
SELECT 
    p.id,
    mp.id,
    4
FROM produtos p, materias_primas mp
WHERE p.nome = 'Cantoneira 50x50x3mm' 
AND mp.nome = 'Bobina Kraft 400g - Largura 70mm';

INSERT INTO receitas (produto_id, materia_prima_id, numero_camadas)
SELECT 
    p.id,
    mp.id,
    1
FROM produtos p, materias_primas mp
WHERE p.nome = 'Cantoneira 50x50x3mm' 
AND mp.nome = 'Bobina Kraft 130g - Largura 160mm';

INSERT INTO receitas (produto_id, materia_prima_id, numero_camadas, consumo_por_metro_g, custo_por_metro)
SELECT 
    p.id,
    mp.id,
    0,
    15,
    0.45
FROM produtos p, materias_primas mp
WHERE p.nome = 'Cantoneira 50x50x3mm' 
AND mp.nome = 'Cola PVA Industrial';

-- Produtos de Revenda
INSERT INTO produtos (nome, codigo_interno, tipo, unidade_venda, permite_medida_composta, preco_venda_unitario, estoque_atual, estoque_minimo, custo_compra, categoria_id, fornecedor_id)
SELECT 
    'Fita Adesiva 48mm Transparente',
    'FTA-48-TRANS',
    'revenda',
    'rolo',
    false,
    15.00,
    150,
    30,
    12.00,
    c.id,
    f.id
FROM categorias c, fornecedores f
WHERE c.nome = 'Adesivos' 
AND f.nome_fantasia = 'Distribuidora ABC'
LIMIT 1;

INSERT INTO produtos (nome, codigo_interno, tipo, unidade_venda, permite_medida_composta, preco_venda_unitario, estoque_atual, estoque_minimo, custo_compra, categoria_id, fornecedor_id)
SELECT 
    'Stretch Film 50cm',
    'STR-50',
    'revenda',
    'rolo',
    false,
    45.00,
    25,
    30,
    35.00,
    c.id,
    f.id
FROM categorias c, fornecedores f
WHERE c.nome = 'Filmes' 
AND f.nome_fantasia = 'Distribuidora ABC'
LIMIT 1;

-- Clientes
INSERT INTO clientes (tipo_pessoa, razao_social, nome_fantasia, cnpj_cpf, email, telefone) VALUES
('juridica', 'Distribuidora ABC Embalagens Ltda', 'Distribuidora ABC', '11.222.333/0001-44', 'contato@distabcemb.com.br', '(19) 3345-6789'),
('juridica', 'Embalagens XYZ Comércio S.A.', 'Embalagens XYZ', '22.333.444/0001-55', 'vendas@embxyz.com.br', '(19) 3456-7890'),
('juridica', 'Papelaria Central Ltda', 'Papelaria Central', '33.444.555/0001-66', 'compras@papcentral.com.br', '(19) 3567-8901');

-- ============================================
-- PERMISSÕES (Row Level Security)
-- ============================================

-- Habilitar RLS em todas as tabelas
ALTER TABLE categorias ENABLE ROW LEVEL SECURITY;
ALTER TABLE fornecedores ENABLE ROW LEVEL SECURITY;
ALTER TABLE materias_primas ENABLE ROW LEVEL SECURITY;
ALTER TABLE produtos ENABLE ROW LEVEL SECURITY;
ALTER TABLE receitas ENABLE ROW LEVEL SECURITY;
ALTER TABLE clientes ENABLE ROW LEVEL SECURITY;
ALTER TABLE pedidos ENABLE ROW LEVEL SECURITY;
ALTER TABLE pedidos_itens ENABLE ROW LEVEL SECURITY;
ALTER TABLE ordens_producao ENABLE ROW LEVEL SECURITY;
ALTER TABLE ordens_producao_consumo ENABLE ROW LEVEL SECURITY;
ALTER TABLE movimentacoes_estoque ENABLE ROW LEVEL SECURITY;

-- Policies básicas (permitir acesso autenticado)
-- NOTA: Ajuste conforme suas necessidades de segurança

CREATE POLICY "Permitir leitura autenticada" ON categorias FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON categorias FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON fornecedores FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON fornecedores FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON materias_primas FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON materias_primas FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON produtos FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON produtos FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON receitas FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON receitas FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON clientes FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON clientes FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON pedidos FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON pedidos FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON pedidos_itens FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON pedidos_itens FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON ordens_producao FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON ordens_producao FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON ordens_producao_consumo FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON ordens_producao_consumo FOR ALL USING (auth.role() = 'authenticated');

CREATE POLICY "Permitir leitura autenticada" ON movimentacoes_estoque FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "Permitir escrita autenticada" ON movimentacoes_estoque FOR ALL USING (auth.role() = 'authenticated');

-- ============================================
-- FIM DO SCHEMA
-- ============================================