-- Phase 1: External Role Management Module System
-- Creates base schema for persona_types, external_roles, modules, role_module_access, module_actions, role_module_permissions

-- ============================================
-- persona_types
-- ============================================
CREATE TABLE IF NOT EXISTS persona_types (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    code varchar(50) UNIQUE NOT NULL,
    name varchar(100) NOT NULL,
    description text,
    is_active boolean DEFAULT true,
    created_at timestamptz DEFAULT NOW(),
    updated_at timestamptz DEFAULT NOW()
);

-- ============================================
-- external_roles
-- ============================================
CREATE TABLE IF NOT EXISTS external_roles (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    role_code varchar(50) UNIQUE NOT NULL,
    role_name varchar(100) NOT NULL,
    persona_type_id uuid REFERENCES persona_types(id),
    description text,
    is_active boolean DEFAULT true,
    onboarding_schema_key varchar(100),
    verification_required boolean DEFAULT true,
    switch_services_enabled boolean DEFAULT false,
    is_publicly_discoverable boolean DEFAULT true,
    sort_order integer DEFAULT 0,
    created_at timestamptz DEFAULT NOW(),
    updated_at timestamptz DEFAULT NOW()
);

CREATE INDEX idx_external_roles_persona ON external_roles(persona_type_id);
CREATE INDEX idx_external_roles_active ON external_roles(is_active);

-- ============================================
-- modules
-- ============================================
CREATE TABLE IF NOT EXISTS modules (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    module_key varchar(50) UNIQUE NOT NULL,
    module_name varchar(100) NOT NULL,
    category varchar(50), -- core/content/marketplace/work/financial
    description text,
    backend_domain varchar(100),
    default_route varchar(255),
    default_sidebar_label varchar(100),
    icon_key varchar(50),
    is_core boolean DEFAULT false,
    is_active boolean DEFAULT true,
    created_at timestamptz DEFAULT NOW(),
    updated_at timestamptz DEFAULT NOW()
);

CREATE INDEX idx_modules_category ON modules(category);
CREATE INDEX idx_modules_active ON modules(is_active);

-- ============================================
-- role_module_access
-- ============================================
CREATE TABLE IF NOT EXISTS role_module_access (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    external_role_id uuid NOT NULL REFERENCES external_roles(id) ON DELETE CASCADE,
    module_id uuid NOT NULL REFERENCES modules(id) ON DELETE CASCADE,
    is_enabled boolean DEFAULT true,
    is_sidebar_visible boolean DEFAULT true,
    sidebar_label_override varchar(100),
    route_override varchar(255),
    sort_order integer DEFAULT 0,
    created_at timestamptz DEFAULT NOW(),
    UNIQUE(external_role_id, module_id)
);

CREATE INDEX idx_role_module_access_role ON role_module_access(external_role_id);

-- ============================================
-- module_actions
-- ============================================
CREATE TABLE IF NOT EXISTS module_actions (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    module_id uuid NOT NULL REFERENCES modules(id) ON DELETE CASCADE,
    action_key varchar(50) NOT NULL,
    action_name varchar(100) NOT NULL,
    description text,
    is_active boolean DEFAULT true,
    created_at timestamptz DEFAULT NOW(),
    UNIQUE(module_id, action_key)
);

CREATE INDEX idx_module_actions_module ON module_actions(module_id);

-- ============================================
-- role_module_permissions
-- ============================================
CREATE TABLE IF NOT EXISTS role_module_permissions (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    external_role_id uuid NOT NULL REFERENCES external_roles(id) ON DELETE CASCADE,
    module_id uuid NOT NULL REFERENCES modules(id) ON DELETE CASCADE,
    can_view boolean DEFAULT false,
    can_list boolean DEFAULT false,
    can_create boolean DEFAULT false,
    can_update boolean DEFAULT false,
    can_delete boolean DEFAULT false,
    extra_actions_json jsonb DEFAULT '{}',
    created_at timestamptz DEFAULT NOW(),
    UNIQUE(external_role_id, module_id)
);

CREATE INDEX idx_role_module_permissions_role ON role_module_permissions(external_role_id);

-- ============================================
-- role_module_widgets
-- ============================================
CREATE TABLE IF NOT EXISTS role_module_widgets (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    external_role_id uuid NOT NULL REFERENCES external_roles(id) ON DELETE CASCADE,
    module_id uuid NOT NULL REFERENCES modules(id) ON DELETE CASCADE,
    widget_key varchar(50),
    is_enabled boolean DEFAULT true,
    sort_order integer DEFAULT 0,
    created_at timestamptz DEFAULT NOW()
);

CREATE INDEX idx_role_module_widgets_role ON role_module_widgets(external_role_id);
