-- =====================================================
-- TABELAS PARA SISTEMA DE EMPRÉSTIMOS
-- =====================================================

-- 1. TABELA DE EMPRÉSTIMOS
CREATE TABLE IF NOT EXISTS emprestimos (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    pessoa VARCHAR(100) NOT NULL DEFAULT 'Maiara',
    valor_total DECIMAL(10,2) NOT NULL,
    valor_restante DECIMAL(10,2) NOT NULL,
    descricao TEXT,
    data_emprestimo DATE NOT NULL DEFAULT CURRENT_DATE,
    status VARCHAR(20) NOT NULL DEFAULT 'ativo' CHECK (status IN ('ativo', 'quitado', 'cancelado')),
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

-- 2. TABELA DE DEVOLUÇÕES/PARCELAS
CREATE TABLE IF NOT EXISTS emprestimo_devolucoes (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    emprestimo_id UUID NOT NULL REFERENCES emprestimos(id) ON DELETE CASCADE,
    valor_devolvido DECIMAL(10,2) NOT NULL,
    data_devolucao DATE NOT NULL DEFAULT CURRENT_DATE,
    observacoes TEXT,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

-- =====================================================
-- ÍNDICES
-- =====================================================

CREATE INDEX IF NOT EXISTS idx_emprestimos_pessoa ON emprestimos(pessoa);
CREATE INDEX IF NOT EXISTS idx_emprestimos_status ON emprestimos(status);
CREATE INDEX IF NOT EXISTS idx_emprestimos_data ON emprestimos(data_emprestimo);
CREATE INDEX IF NOT EXISTS idx_devolucoes_emprestimo ON emprestimo_devolucoes(emprestimo_id);
CREATE INDEX IF NOT EXISTS idx_devolucoes_data ON emprestimo_devolucoes(data_devolucao);

-- =====================================================
-- TRIGGERS PARA UPDATED_AT
-- =====================================================

CREATE TRIGGER update_emprestimos_updated_at 
    BEFORE UPDATE ON emprestimos 
    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

CREATE TRIGGER update_emprestimo_devolucoes_updated_at 
    BEFORE UPDATE ON emprestimo_devolucoes 
    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

-- =====================================================
-- FUNÇÃO PARA ATUALIZAR VALOR RESTANTE
-- =====================================================

CREATE OR REPLACE FUNCTION atualizar_valor_restante_emprestimo()
RETURNS TRIGGER AS $$
BEGIN
    -- Atualizar valor restante do empréstimo
    UPDATE emprestimos 
    SET valor_restante = valor_total - (
        SELECT COALESCE(SUM(valor_devolvido), 0) 
        FROM emprestimo_devolucoes 
        WHERE emprestimo_id = NEW.emprestimo_id
    ),
    status = CASE 
        WHEN (valor_total - (
            SELECT COALESCE(SUM(valor_devolvido), 0) 
            FROM emprestimo_devolucoes 
            WHERE emprestimo_id = NEW.emprestimo_id
        )) <= 0 THEN 'quitado'
        ELSE 'ativo'
    END,
    updated_at = NOW()
    WHERE id = NEW.emprestimo_id;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Trigger para atualizar automaticamente quando há devolução
CREATE TRIGGER trigger_atualizar_valor_restante
    AFTER INSERT OR UPDATE OR DELETE ON emprestimo_devolucoes
    FOR EACH ROW EXECUTE FUNCTION atualizar_valor_restante_emprestimo();

-- =====================================================
-- POLÍTICAS RLS (ROW LEVEL SECURITY)
-- =====================================================

ALTER TABLE emprestimos ENABLE ROW LEVEL SECURITY;
ALTER TABLE emprestimo_devolucoes ENABLE ROW LEVEL SECURITY;

-- Políticas para permitir todas as operações (ajuste conforme necessário)
CREATE POLICY "Enable all operations for authenticated users" ON emprestimos FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON emprestimo_devolucoes FOR ALL USING (true);

-- =====================================================
-- DADOS INICIAIS (OPCIONAL)
-- =====================================================

-- Exemplo de empréstimo inicial (remover se não quiser)
-- INSERT INTO emprestimos (pessoa, valor_total, valor_restante, descricao, data_emprestimo) 
-- VALUES ('Maiara', 500.00, 500.00, 'Empréstimo inicial para teste', CURRENT_DATE);
