-- +goose Up
-- +goose StatementBegin

-- ─────────────────────────────────────────────────────────────────────────────
-- Adiciona colunas de funcionário na tabela users
-- (dados pessoais, endereço, cargo, código de acesso PIN)
-- ─────────────────────────────────────────────────────────────────────────────
ALTER TABLE users
    ADD COLUMN IF NOT EXISTS rg              TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS cpf             TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS celular         TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS codigo_acesso   TEXT        NOT NULL DEFAULT '', -- PIN hash
    ADD COLUMN IF NOT EXISTS cep             TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS logradouro      TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS numero          TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS complemento     TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS bairro          TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS cidade          TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS uf              CHAR(2)     NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS cargo           TEXT        NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS data_nascimento TEXT        NOT NULL DEFAULT '';

-- Índice para busca por CPF (único por tenant)
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_tenant_cpf
    ON users (tenant_id, cpf)
    WHERE cpf <> '';

-- Índice para busca por cargo
CREATE INDEX IF NOT EXISTS idx_users_tenant_cargo
    ON users (tenant_id, cargo);

-- ─────────────────────────────────────────────────────────────────────────────
-- Tabela de sessões / refresh tokens: adiciona user_agent para auditoria
-- ─────────────────────────────────────────────────────────────────────────────
ALTER TABLE refresh_tokens
    ADD COLUMN IF NOT EXISTS user_agent TEXT NOT NULL DEFAULT '',
    ADD COLUMN IF NOT EXISTS ip         INET;

-- ─────────────────────────────────────────────────────────────────────────────
-- Ordens de produção: adiciona etapas de confecção
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS etapas_producao (
    id               UUID        PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id        UUID        NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    ordem_id         UUID        NOT NULL REFERENCES ordens_producao(id) ON DELETE CASCADE,
    etapa            TEXT        NOT NULL
                                 CHECK (etapa IN (
                                     'separacao','corte','bordado','silk',
                                     'sublimacao','dtf','aplik','costura',
                                     'acabamento','entrega'
                                 )),
    status           TEXT        NOT NULL DEFAULT 'pendente'
                                 CHECK (status IN ('pendente','em_andamento','concluido','pulado')),
    responsavel_id   UUID        REFERENCES users(id) ON DELETE SET NULL,
    iniciado_em      TIMESTAMPTZ,
    concluido_em     TIMESTAMPTZ,
    observacoes      TEXT        NOT NULL DEFAULT '',
    criado_em        TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_etapas_tenant_criado ON etapas_producao (tenant_id, criado_em DESC);
CREATE INDEX IF NOT EXISTS idx_etapas_ordem         ON etapas_producao (tenant_id, ordem_id);
CREATE INDEX IF NOT EXISTS idx_etapas_etapa         ON etapas_producao (tenant_id, etapa, status);

ALTER TABLE etapas_producao ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON etapas_producao
    USING (tenant_id = current_setting('app.tenant_id', true)::uuid);

-- ─────────────────────────────────────────────────────────────────────────────
-- Pedido itens (linha de produto por pedido)
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS pedido_itens (
    id           UUID          PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id    UUID          NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    pedido_id    UUID          NOT NULL REFERENCES pedidos(id) ON DELETE CASCADE,
    produto_id   UUID          REFERENCES produtos(id) ON DELETE SET NULL,
    descricao    TEXT          NOT NULL DEFAULT '',
    quantidade   INTEGER       NOT NULL DEFAULT 1,
    preco_unit   NUMERIC(15,4) NOT NULL DEFAULT 0,
    desconto     NUMERIC(15,4) NOT NULL DEFAULT 0,
    total        NUMERIC(15,4) GENERATED ALWAYS AS (quantidade * (preco_unit - desconto)) STORED,
    criado_em    TIMESTAMPTZ   NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_pedido_itens_tenant_criado ON pedido_itens (tenant_id, criado_em DESC);
CREATE INDEX IF NOT EXISTS idx_pedido_itens_pedido        ON pedido_itens (tenant_id, pedido_id);

ALTER TABLE pedido_itens ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON pedido_itens
    USING (tenant_id = current_setting('app.tenant_id', true)::uuid);

-- ─────────────────────────────────────────────────────────────────────────────
-- Notificações internas
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS notificacoes (
    id          UUID        PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id   UUID        NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    user_id     UUID        REFERENCES users(id) ON DELETE CASCADE,
    tipo        TEXT        NOT NULL, -- 'estoque_minimo', 'pedido_atrasado', etc.
    titulo      TEXT        NOT NULL,
    mensagem    TEXT        NOT NULL,
    lida        BOOLEAN     NOT NULL DEFAULT false,
    lida_em     TIMESTAMPTZ,
    entidade    TEXT,       -- 'pedido', 'produto', etc.
    entidade_id UUID,
    criado_em   TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_notif_tenant_criado  ON notificacoes (tenant_id, criado_em DESC);
CREATE INDEX IF NOT EXISTS idx_notif_user_nao_lida  ON notificacoes (tenant_id, user_id, lida)
    WHERE lida = false;

ALTER TABLE notificacoes ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON notificacoes
    USING (tenant_id = current_setting('app.tenant_id', true)::uuid);

-- ─────────────────────────────────────────────────────────────────────────────
-- Trigger: atualiza total do pedido ao inserir/atualizar itens
-- ─────────────────────────────────────────────────────────────────────────────
CREATE OR REPLACE FUNCTION recalcular_total_pedido()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
    UPDATE pedidos
    SET    total = (
               SELECT COALESCE(SUM(total), 0)
               FROM   pedido_itens
               WHERE  pedido_id = COALESCE(NEW.pedido_id, OLD.pedido_id)
           )
    WHERE  id = COALESCE(NEW.pedido_id, OLD.pedido_id);
    RETURN COALESCE(NEW, OLD);
END;
$$;

DROP TRIGGER IF EXISTS trg_recalcular_total ON pedido_itens;
CREATE TRIGGER trg_recalcular_total
    AFTER INSERT OR UPDATE OR DELETE ON pedido_itens
    FOR EACH ROW EXECUTE FUNCTION recalcular_total_pedido();

-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP TRIGGER  IF EXISTS trg_recalcular_total       ON pedido_itens;
DROP FUNCTION IF EXISTS recalcular_total_pedido;
DROP TABLE    IF EXISTS notificacoes    CASCADE;
DROP TABLE    IF EXISTS pedido_itens    CASCADE;
DROP TABLE    IF EXISTS etapas_producao CASCADE;
ALTER TABLE users
    DROP COLUMN IF EXISTS rg,
    DROP COLUMN IF EXISTS cpf,
    DROP COLUMN IF EXISTS celular,
    DROP COLUMN IF EXISTS codigo_acesso,
    DROP COLUMN IF EXISTS cep,
    DROP COLUMN IF EXISTS logradouro,
    DROP COLUMN IF EXISTS numero,
    DROP COLUMN IF EXISTS complemento,
    DROP COLUMN IF EXISTS bairro,
    DROP COLUMN IF EXISTS cidade,
    DROP COLUMN IF EXISTS uf,
    DROP COLUMN IF EXISTS cargo,
    DROP COLUMN IF EXISTS data_nascimento;
ALTER TABLE refresh_tokens
    DROP COLUMN IF EXISTS user_agent,
    DROP COLUMN IF EXISTS ip;
-- +goose StatementEnd
