#!/bin/bash
set -e

REAL_BOT="/opt/services/bots/trading_bot/Stock_Bot"
SHADOW_BOT="/opt/services/bots/shadow_bot/Stock_Bot"
SHADOW_LLM="/opt/services/shadow_llm"
VENV="/opt/services/bots/trading_bot/venv/bin/python3"

echo "=== CREATING SHADOW BOT DIRECTORY STRUCTURE ==="
mkdir -p $SHADOW_BOT/models
mkdir -p $SHADOW_BOT/logs/debug
mkdir -p $SHADOW_BOT/features/daily
mkdir -p $SHADOW_BOT/features/weekly
mkdir -p $SHADOW_BOT/backup/logs
mkdir -p $SHADOW_BOT/charts
mkdir -p $SHADOW_BOT/ops

echo "=== SYMLINKING SHARED DATA (read-only) ==="
# Shadow bot reads real bot's price + sentiment data via symlink
# SQLite WAL mode supports multiple concurrent readers safely
ln -sfn $REAL_BOT/data $SHADOW_BOT/data
echo "Symlink: $SHADOW_BOT/data -> $REAL_BOT/data"

echo "=== COPYING BOT SCRIPT ==="
cp $REAL_BOT/StockTrading.py $SHADOW_BOT/StockTrading.py
cp $REAL_BOT/gen_dashboard.py $SHADOW_BOT/gen_dashboard.py 2>/dev/null || true
echo "Bot script copied"

echo "=== PATCHING SHADOW BOT PATHS ==="
python3 - << 'PATCHEOF'
import re

src = open('/opt/services/bots/shadow_bot/Stock_Bot/StockTrading.py').read()
changes = 0

# Patch 1: Add SHADOW_MODE constant at top of constants section
SHADOW_MARKER = '# ─────────────────────────────────────────────'
SHADOW_BLOCK = '''# SHADOW BOT MODE — set by setup_shadow.sh
# Shadow bot reads data read-only, writes to its own logs/models/features
SHADOW_MODE = True
'''
# Find first constant block
idx = src.find('NUM_AGENTS')
line_start = src.rfind('\n', 0, idx) + 1
src = src[:line_start] + SHADOW_BLOCK + src[line_start:]
changes += 1
print("Patch 1: SHADOW_MODE constant added")

# Patch 2: Open all SQLite DBs read-only in shadow mode
OLD_CONNECT = 'with sqlite3.connect(self.path) as conn:'
NEW_CONNECT = ('# Shadow mode: open read-only to never corrupt real bot data\n'
               '        _uri = f"file:{self.path}?mode=ro&immutable=1" if SHADOW_MODE else self.path\n'
               '        _is_uri = SHADOW_MODE\n'
               '        with sqlite3.connect(_uri, uri=_is_uri) as conn:')
if OLD_CONNECT in src:
    src = src.replace(OLD_CONNECT, NEW_CONNECT, 1)
    changes += 1
    print("Patch 2: SQLite opens read-only in shadow mode")

# Patch 3: Skip Finnhub thread in shadow mode (saves API quota)
OLD_FINNHUB = 'self.finnhub_thread = threading.Thread('
NEW_FINNHUB = ('if not SHADOW_MODE:  # Shadow skips Finnhub, reads sentiment from shared DB\n'
               '            self.finnhub_thread = threading.Thread(')
if OLD_FINNHUB in src:
    src = src.replace(OLD_FINNHUB, NEW_FINNHUB, 1)
    # Find the matching thread.start() and wrap it too
    changes += 1
    print("Patch 3: Finnhub skipped in shadow mode")

# Patch 4: Reduce max workers for shadow (leave cores for real bot)
OLD_WORKERS = '"--max-workers", "16"'
# This is in systemd service not the script, skip
print("Patch 4: workers set in service file")

# Patch 5: Change GitHub backup paths to shadow_backup
src = src.replace(
    '"Stock_Bot/backup/',
    '"Stock_Bot/shadow_backup/'
)
changes += 1
print("Patch 5: GitHub backup -> shadow_backup/")

# Patch 6: Add shadow label to log output
OLD_TITLE = '"ML Trading System v8'
NEW_TITLE = '"ML Trading System v8 [SHADOW]'
if OLD_TITLE in src:
    src = src.replace(OLD_TITLE, NEW_TITLE, 1)
    changes += 1
    print("Patch 6: [SHADOW] label in startup log")

open('/opt/services/bots/shadow_bot/Stock_Bot/StockTrading.py', 'w').write(src)
print(f"\n{changes} patches applied to shadow bot")

# Syntax check
import py_compile, tempfile, os
tmp = tempfile.mktemp(suffix='.py')
open(tmp,'w').write(src)
try:
    py_compile.compile(tmp, doraise=True)
    print(f"SYNTAX: PASS — {len(src.splitlines())} lines")
except py_compile.PyCompileError as e:
    print(f"SYNTAX ERROR: {e}")
finally:
    os.unlink(tmp)
PATCHEOF

echo "=== CREATING FRESH SHADOW STATE ==="
echo '{"weekend_date":"","eod_date":"","saved_at":"shadow_fresh_start"}' > $SHADOW_BOT/logs/train_done.json
echo "timestamp,agent,type,symbol,shares,entry_price,exit_price,pnl,pnl_pct,predicted_pct,disc_pp,reason,held_secs,own_conf,meta_conf,eff_conf" > $SHADOW_BOT/logs/TRADE_LOG.csv
echo "Shadow state initialized"

echo "=== CREATING SHADOW LLM DIRECTORY ==="
mkdir -p $SHADOW_LLM/knowledge
mkdir -p $SHADOW_LLM/proposals
mkdir -p $SHADOW_LLM/reports
echo "Shadow LLM directory created"

echo "=== SETUP COMPLETE ==="
ls -la $SHADOW_BOT/
echo "Data symlink: $(readlink $SHADOW_BOT/data)"
