-- Ativar extensões necessárias
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- Banco de Dados - Primeira Parte (Clientes, Endereços e Contatos)

-- Tabela de Clientes
CREATE TABLE clientes (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    tipo_pessoa VARCHAR(10) NOT NULL, -- 'CPF' ou 'CNPJ'
    cpf_cnpj VARCHAR(20) NOT NULL UNIQUE,
    inscricao_estadual VARCHAR(30),
    nome_razao_social VARCHAR(255) NOT NULL,
    nome_fantasia VARCHAR(255),
    email_principal VARCHAR(255),
    telefone_principal VARCHAR(30),
    observacoes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabela de Endereços dos Clientes
CREATE TABLE enderecos_cliente (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    cliente_id UUID REFERENCES clientes(id) ON DELETE CASCADE,
    tipo_endereco VARCHAR(20) NOT NULL, -- 'obra', 'faturamento'
    cep VARCHAR(10) NOT NULL,
    logradouro VARCHAR(255) NOT NULL,
    numero VARCHAR(20) NOT NULL,
    complemento VARCHAR(255),
    bairro VARCHAR(100) NOT NULL,
    cidade VARCHAR(100) NOT NULL,
    estado VARCHAR(50) NOT NULL,
    pais VARCHAR(50) DEFAULT 'Brasil',
    referencia VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabela de Contatos dos Clientes
CREATE TABLE contatos_cliente (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    cliente_id UUID REFERENCES clientes(id) ON DELETE CASCADE,
    tipo_contato VARCHAR(20) NOT NULL, -- 'obra', 'faturamento', 'geral', 'outros'
    nome VARCHAR(255) NOT NULL,
    cargo VARCHAR(100),
    email VARCHAR(255),
    telefone VARCHAR(30),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabela de Caminhões
CREATE TABLE trucks (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_empresa UUID REFERENCES empresas(id),
    placa VARCHAR(10) NOT NULL UNIQUE,
    modelo VARCHAR(100) NOT NULL,
    capacidade_m3 DECIMAL(5,2) NOT NULL,
    status VARCHAR(20) NOT NULL DEFAULT 'ativo',
    motorista_atual_id UUID REFERENCES employees(id),
    localizacao_atual VARCHAR(255),
    observacoes TEXT,
    data_cadastro TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    data_atualizacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabela de Manutenção de Caminhões
CREATE TABLE truck_maintenance (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_truck UUID REFERENCES trucks(id) NOT NULL,
    tipo VARCHAR(20) NOT NULL,
    descricao TEXT NOT NULL,
    fornecedor_id UUID REFERENCES suppliers(id),
    valor_custo DECIMAL(10,2) NOT NULL,
    data_manutencao DATE NOT NULL,
    data_pagamento DATE,
    observacoes TEXT,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabela de Apólices de Seguro
CREATE TABLE insurance_policies (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    tipo VARCHAR(20) NOT NULL,
    id_relacionado UUID,
    seguradora VARCHAR(255) NOT NULL,
    cobertura TEXT,
    valor_total DECIMAL(10,2),
    valor_mensal DECIMAL(10,2),
    data_inicio DATE NOT NULL,
    data_fim DATE,
    status VARCHAR(20) NOT NULL,
    observacoes TEXT,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabela de Contas Bancárias
CREATE TABLE bank_accounts (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    nome_banco VARCHAR(100) NOT NULL,
    tipo_conta VARCHAR(20) NOT NULL, -- Ex: 'corrente', 'poupança', 'pagamento'
    agencia VARCHAR(20),
    numero_conta VARCHAR(30),
    titular VARCHAR(100),
    documento_titular VARCHAR(20),
    saldo_inicial DECIMAL(12,2) DEFAULT 0.00,
    saldo_atual DECIMAL(12,2) DEFAULT 0.00,
    data_abertura DATE,
    status VARCHAR(20) DEFAULT 'ativa', -- ativa, inativa, encerrada
    observacoes TEXT,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);


-- 1. Tabela de Contas Financeiras (caixa, bancos, cartão, etc)
CREATE TABLE IF NOT EXISTS financial_accounts (
  id            UUID      PRIMARY KEY DEFAULT gen_random_uuid(),
  nome          VARCHAR(100) NOT NULL,
  tipo          VARCHAR(20)  NOT NULL, -- 'caixa', 'banco', 'cartao'
  saldo_inicial DECIMAL(12,2) DEFAULT 0,
  criado_em     TIMESTAMP DEFAULT now()
);

-- 2. Tabela de Categorias de Despesa
CREATE TABLE IF NOT EXISTS expense_categories (
  id        UUID      PRIMARY KEY DEFAULT gen_random_uuid(),
  nome      VARCHAR(100) NOT NULL,
  criado_em TIMESTAMP DEFAULT now()
);

-- 3. Tabela de Receitas
CREATE TABLE IF NOT EXISTS revenues (
  id                    UUID      PRIMARY KEY DEFAULT gen_random_uuid(),
  tipo                  VARCHAR(20) NOT NULL,   -- 'locacao', 'venda_reciclaveis', 'outros'
  referencia_id         UUID,                    -- id da locação ou venda
  descricao             TEXT,
  valor                 DECIMAL(12,2) NOT NULL,
  data_recebimento      DATE      NOT NULL,
  conta_financeira_id   UUID      REFERENCES financial_accounts(id),
  status                VARCHAR(20) DEFAULT 'pendente', -- 'pendente','recebido','protestado'
  num_documento         VARCHAR(50),
  criado_em             TIMESTAMP DEFAULT now()
);

-- 4. Tabela de Despesas
CREATE TABLE IF NOT EXISTS expenses (
  id                    UUID      PRIMARY KEY DEFAULT gen_random_uuid(),
  categoria_id          UUID      REFERENCES expense_categories(id),
  fornecedor_id         UUID      REFERENCES suppliers(id),
  descricao             TEXT,
  valor                 DECIMAL(12,2) NOT NULL,
  data_servico          DATE      NOT NULL,
  data_vencimento       DATE,
  data_pagamento        DATE,
  forma_pagamento       VARCHAR(20),            -- 'dinheiro','pix','cartao','boleto'
  conta_financeira_id   UUID      REFERENCES financial_accounts(id),
  num_documento         VARCHAR(50),
  status                VARCHAR(20) DEFAULT 'pendente', -- 'pendente','pago'
  criado_em             TIMESTAMP DEFAULT now()
);

-- 5. Automatizar baixa de protestos
ALTER TABLE revenues
  ADD COLUMN IF NOT EXISTS num_protesto VARCHAR(50),
  ADD COLUMN IF NOT EXISTS data_protesto DATE,
  ADD COLUMN IF NOT EXISTS protestado_em TIMESTAMP;

-- 6. Exemplo de lançamento automático de despesa de manutenção
-- (quando uma manutenção for inserida em truck_maintenance ou machine_maintenance,
--  um trigger pode inserir na tabela expenses)



-- Tabela de Alertas
CREATE TABLE alerts (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    data_alerta DATE NOT NULL,
    tipo TEXT NOT NULL,
    destinatario TEXT NOT NULL,
    observacoes TEXT,
    status TEXT DEFAULT 'pendente',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Registra todas as compras de diesel (ou outro combustível) que chegam ao tanque central
CREATE TABLE fuel_tank_entries (
  id               UUID      PRIMARY KEY DEFAULT gen_random_uuid(),
  data_compra      DATE      NOT NULL,
  fornecedor_id    UUID      REFERENCES suppliers(id),
  litros_entregues DECIMAL(10,2) NOT NULL,
  preco_litro      DECIMAL(10,2) NOT NULL,
  valor_total      DECIMAL(12,2) GENERATED ALWAYS AS (litros_entregues * preco_litro) STORED,
  observacoes      TEXT,
  criado_em        TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Registra o ato de abastecer um veículo/máquina a partir do tanque
CREATE TABLE vehicle_refuels (
  id                UUID      PRIMARY KEY DEFAULT gen_random_uuid(),
  id_veiculo        UUID      NOT NULL,            -- pode ser truck_id ou patrimônio genérico
  id_funcionario    UUID      REFERENCES employees(id),
  tipo              VARCHAR(20) NOT NULL,         -- 'galpao', 'viagem', etc.
  data_abastecimento DATE     NOT NULL,
  km_anterior       INTEGER,                       -- kilometragem na última vez
  km_atual          INTEGER,                       -- kilometragem atual
  distancia_km      INTEGER GENERATED ALWAYS AS (km_atual - km_anterior) STORED,
  litros            DECIMAL(6,2) NOT NULL,
  consumo_medio     DECIMAL(6,2) GENERATED ALWAYS AS (
                       CASE 
                         WHEN (km_atual - km_anterior) > 0 
                         THEN (litros / (km_atual - km_anterior) * 100) 
                         ELSE NULL 
                       END
                     ) STORED,                    -- L/100 km
  preco_litro       DECIMAL(6,2),
  valor_total       DECIMAL(10,2) GENERATED ALWAYS AS (litros * preco_litro) STORED,
  fornecedor_id     UUID      REFERENCES suppliers(id),
  observacoes       TEXT,
  criado_em         TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);


CREATE TABLE patrimonios (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    tipo_bem VARCHAR(50) NOT NULL, -- Ex: Caminhão, Esteira, Impressora...
    nome_identificacao VARCHAR(100) NOT NULL, -- Nome ou apelido interno do bem
    descricao TEXT,
    valor_pago DECIMAL(12,2),
    financiado BOOLEAN DEFAULT FALSE,
    valor_parcela DECIMAL(12,2),
    possui_seguro BOOLEAN DEFAULT FALSE,
    seguradora_id UUID REFERENCES suppliers(id),
    data_aquisicao DATE,
    status VARCHAR(20) DEFAULT 'ativo',
    observacoes TEXT,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

ALTER TABLE truck_maintenance RENAME TO manutencoes;
ALTER TABLE manutencoes
RENAME COLUMN id_truck TO id_patrimonio;

ALTER TABLE manutencoes
ADD CONSTRAINT fk_patrimonio FOREIGN KEY (id_patrimonio) REFERENCES patrimonios(id) ON DELETE CASCADE;

-- Exemplo de entrada
INSERT INTO insurance_policies (
    tipo, id_relacionado, seguradora, cobertura, valor_total, valor_mensal,
    data_inicio, data_fim, status, observacoes
) VALUES (
    'patrimonio', 'UUID_DO_PATRIMONIO', 'Porto Seguro', 'Cobertura Total', 50000.00, 1200.00,
    '2024-01-01', '2025-01-01', 'ativo', 'Seguro de empilhadeira'
);

CREATE TABLE employee_payroll (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_employee UUID REFERENCES employees(id),
    competencia VARCHAR(7) NOT NULL, -- Ex: '04/2025'
    salario_base DECIMAL(10,2),
    horas_extras DECIMAL(5,2),
    adicional_periculosidade DECIMAL(10,2),
    adicional_insalubridade DECIMAL(10,2),
    descontos_inss DECIMAL(10,2),
    descontos_fgts DECIMAL(10,2),
    descontos_irrf DECIMAL(10,2),
    outros_descontos DECIMAL(10,2),
    beneficios DECIMAL(10,2),
    salario_liquido DECIMAL(10,2),
    data_pagamento DATE,
    status_pagamento VARCHAR(20) DEFAULT 'pendente',
    observacoes TEXT,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE ponto_digital (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  id_funcionario UUID NOT NULL REFERENCES employees(id),
  tipo VARCHAR(20) NOT NULL, -- entrada, saída, intervalo, etc.
  data_hora TIMESTAMP NOT NULL,
  latitude DECIMAL(9,6),
  longitude DECIMAL(9,6),
  criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE employee_ponto (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    id_funcionario UUID REFERENCES employees(id) NOT NULL,
    tipo_registro VARCHAR(20) CHECK (tipo_registro IN ('entrada', 'almoco_saida', 'almoco_volta', 'saida_final')) NOT NULL,
    data_registro DATE NOT NULL,
    hora_registro TIME NOT NULL,
    ip TEXT,
    localizacao TEXT,
    observacoes TEXT,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);




