-- =====================================================
-- ML SCHEMA - LLM DECISIONS TABLE
-- =====================================================
-- Description: Decisions made by the LLM Trading Agent
-- Schema: ml
-- Author: Database Agent
-- Date: 2026-01-04
-- Module: OQI-010-llm-trading-integration
-- =====================================================

CREATE TABLE ml.llm_decisions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

  -- Reference to prediction
  prediction_id UUID REFERENCES ml.llm_predictions(id) ON DELETE SET NULL,

  -- Decision details
  decision_type VARCHAR(50) NOT NULL,
  action_taken VARCHAR(50) NOT NULL,
  reasoning TEXT,

  -- Risk assessment
  risk_level VARCHAR(20),
  position_size DECIMAL(10,4),
  risk_pct DECIMAL(5,4) CHECK (risk_pct >= 0 AND risk_pct <= 1),

  -- Execution details
  executed BOOLEAN NOT NULL DEFAULT FALSE,
  execution_venue VARCHAR(20),
  order_id VARCHAR(100),

  -- Timestamps
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  -- Constraints
  CONSTRAINT chk_llm_decisions_type CHECK (
    decision_type IN (
      'TRADE',           -- Execute a trade
      'ALERT',           -- Send alert to user
      'WAIT',            -- Wait for better conditions
      'CLOSE',           -- Close existing position
      'PARTIAL_CLOSE',   -- Partially close position
      'MODIFY_SL',       -- Modify stop loss
      'MODIFY_TP',       -- Modify take profit
      'SCALE_IN',        -- Add to existing position
      'HEDGE',           -- Open hedging position
      'STANDBY'          -- No action, monitoring
    )
  ),
  CONSTRAINT chk_llm_decisions_action CHECK (
    action_taken IN (
      'BUY', 'SELL', 'HOLD', 'CLOSE_LONG', 'CLOSE_SHORT',
      'PARTIAL_CLOSE_LONG', 'PARTIAL_CLOSE_SHORT',
      'MOVE_SL_BE', 'TRAILING_STOP', 'ALERT_SENT',
      'WAITING', 'MONITORING', 'REJECTED', 'SKIPPED'
    )
  ),
  CONSTRAINT chk_llm_decisions_risk_level CHECK (
    risk_level IS NULL OR risk_level IN (
      'minimal', 'conservative', 'moderate', 'aggressive', 'high_risk'
    )
  ),
  CONSTRAINT chk_llm_decisions_venue CHECK (
    execution_venue IS NULL OR execution_venue IN ('MT4', 'MT5', 'BINANCE', 'PAPER')
  ),
  CONSTRAINT chk_llm_decisions_position_size CHECK (
    position_size IS NULL OR position_size > 0
  ),
  CONSTRAINT chk_llm_decisions_execution CHECK (
    (executed = TRUE AND execution_venue IS NOT NULL) OR executed = FALSE
  )
);

-- Indices
CREATE INDEX idx_llm_decisions_prediction ON ml.llm_decisions(prediction_id)
  WHERE prediction_id IS NOT NULL;
CREATE INDEX idx_llm_decisions_type ON ml.llm_decisions(decision_type);
CREATE INDEX idx_llm_decisions_action ON ml.llm_decisions(action_taken);
CREATE INDEX idx_llm_decisions_executed ON ml.llm_decisions(executed);
CREATE INDEX idx_llm_decisions_venue ON ml.llm_decisions(execution_venue)
  WHERE execution_venue IS NOT NULL;
CREATE INDEX idx_llm_decisions_order ON ml.llm_decisions(order_id)
  WHERE order_id IS NOT NULL;
CREATE INDEX idx_llm_decisions_created ON ml.llm_decisions(created_at DESC);
CREATE INDEX idx_llm_decisions_risk_level ON ml.llm_decisions(risk_level)
  WHERE risk_level IS NOT NULL;

-- Index for trade decisions that were executed
CREATE INDEX idx_llm_decisions_trades ON ml.llm_decisions(created_at DESC)
  WHERE decision_type = 'TRADE' AND executed = TRUE;

-- Comments
COMMENT ON TABLE ml.llm_decisions IS 'Decisions made by the LLM Trading Agent based on predictions and risk assessment';

COMMENT ON COLUMN ml.llm_decisions.id IS 'Unique identifier for the decision';
COMMENT ON COLUMN ml.llm_decisions.prediction_id IS 'Reference to the prediction that triggered this decision';
COMMENT ON COLUMN ml.llm_decisions.decision_type IS 'Type of decision: TRADE, ALERT, WAIT, CLOSE, etc.';
COMMENT ON COLUMN ml.llm_decisions.action_taken IS 'Specific action: BUY, SELL, HOLD, CLOSE_LONG, etc.';
COMMENT ON COLUMN ml.llm_decisions.reasoning IS 'LLM generated reasoning for the decision';
COMMENT ON COLUMN ml.llm_decisions.risk_level IS 'Risk profile applied: minimal, conservative, moderate, aggressive';
COMMENT ON COLUMN ml.llm_decisions.position_size IS 'Position size in lots or units';
COMMENT ON COLUMN ml.llm_decisions.risk_pct IS 'Risk percentage of capital (0.0 to 1.0)';
COMMENT ON COLUMN ml.llm_decisions.executed IS 'Whether the decision was executed in market';
COMMENT ON COLUMN ml.llm_decisions.execution_venue IS 'Execution venue: MT4, MT5, BINANCE, or PAPER';
COMMENT ON COLUMN ml.llm_decisions.order_id IS 'Order ID from execution venue if executed';
COMMENT ON COLUMN ml.llm_decisions.created_at IS 'Timestamp when decision was made';
