-- +goose Up
-- +goose StatementBegin

-- ─────────────────────────────────────────────────────────────────────────────
-- Extensions
-- ─────────────────────────────────────────────────────────────────────────────
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE EXTENSION IF NOT EXISTS "citext";

-- ─────────────────────────────────────────────────────────────────────────────
-- TENANTS
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE tenants (
    id            UUID        PRIMARY KEY DEFAULT uuid_generate_v4(),
    slug          CITEXT      NOT NULL UNIQUE,
    nome          TEXT        NOT NULL,
    plano         TEXT        NOT NULL DEFAULT 'free'
                              CHECK (plano IN ('free','starter','pro','enterprise')),
    status        TEXT        NOT NULL DEFAULT 'active'
                              CHECK (status IN ('active','suspended','cancelled')),
    config        JSONB       NOT NULL DEFAULT '{}',
    max_usuarios  INTEGER     NOT NULL DEFAULT 5,
    criado_em     TIMESTAMPTZ NOT NULL DEFAULT now(),
    atualizado_em TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX idx_tenants_slug     ON tenants (slug);
CREATE INDEX idx_tenants_status   ON tenants (status);
CREATE INDEX idx_tenants_criado   ON tenants (criado_em DESC);

-- ─────────────────────────────────────────────────────────────────────────────
-- USERS
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE users (
    id             UUID        PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id      UUID        NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    nome           TEXT        NOT NULL,
    email          CITEXT      NOT NULL,
    senha_hash     TEXT        NOT NULL,
    role           TEXT        NOT NULL DEFAULT 'user'
                               CHECK (role IN ('owner','admin','manager','user','readonly')),
    permissoes     TEXT[]      NOT NULL DEFAULT '{}',
    ativo          BOOLEAN     NOT NULL DEFAULT true,
    ultimo_login   TIMESTAMPTZ,
    criado_em      TIMESTAMPTZ NOT NULL DEFAULT now(),
    atualizado_em  TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE (tenant_id, email)
);

CREATE INDEX idx_users_tenant_id     ON users (tenant_id);
CREATE INDEX idx_users_email         ON users (email);
CREATE INDEX idx_users_tenant_criado ON users (tenant_id, criado_em DESC);

-- ─────────────────────────────────────────────────────────────────────────────
-- REFRESH TOKENS
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE refresh_tokens (
    id          UUID        PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id   UUID        NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    user_id     UUID        NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    token_hash  TEXT        NOT NULL UNIQUE,
    expires_at  TIMESTAMPTZ NOT NULL,
    revogado    BOOLEAN     NOT NULL DEFAULT false,
    criado_em   TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX idx_refresh_tokens_tenant_criado ON refresh_tokens (tenant_id, criado_em DESC);
CREATE INDEX idx_refresh_tokens_user_id       ON refresh_tokens (user_id);

-- ─────────────────────────────────────────────────────────────────────────────
-- RLS
-- ─────────────────────────────────────────────────────────────────────────────
ALTER TABLE users          ENABLE ROW LEVEL SECURITY;
ALTER TABLE refresh_tokens ENABLE ROW LEVEL SECURITY;

-- users policy
CREATE POLICY tenant_isolation ON users
    USING (tenant_id = current_setting('app.tenant_id', true)::uuid);

-- refresh_tokens policy
CREATE POLICY tenant_isolation ON refresh_tokens
    USING (tenant_id = current_setting('app.tenant_id', true)::uuid);

-- ─────────────────────────────────────────────────────────────────────────────
-- updated_at trigger
-- ─────────────────────────────────────────────────────────────────────────────
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
    NEW.atualizado_em = now();
    RETURN NEW;
END;
$$;

CREATE TRIGGER trg_tenants_updated BEFORE UPDATE ON tenants
    FOR EACH ROW EXECUTE FUNCTION set_updated_at();

CREATE TRIGGER trg_users_updated BEFORE UPDATE ON users
    FOR EACH ROW EXECUTE FUNCTION set_updated_at();

-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS refresh_tokens CASCADE;
DROP TABLE IF EXISTS users          CASCADE;
DROP TABLE IF EXISTS tenants        CASCADE;
DROP FUNCTION IF EXISTS set_updated_at CASCADE;
-- +goose StatementEnd
