import sys
import json
import joblib
import pandas as pd
import subprocess

# === Признаки для каждой модели (порядок как при обучении) ===

FEATURES_LONG = [
    "atr3_pct", "range_24h_pct", "bb_upper_distance_pct", "round_level_lower_pct", "price_position_24h_pct",
    "ema50_distance_pct", "ema1_delta_1h_pct", "di_minus"
]

FEATURES_SHORT = [
    "atr3_pct", "range_24h_pct", "bb_upper_distance_pct", "round_level_lower_pct", "price_position_24h_pct",
    "ema50_distance_pct", "ema1_delta_1h_pct", "di_plus"
]

FEATURES_FLAT = [
    "atr6_pct", "hour_cos", "hour_sin"
]

# === Загрузка моделей ===

try:
    with open('model_long.pkl', 'rb') as f:
        model_long = joblib.load(f)
except Exception as e:
    print(json.dumps({"error": f"Cannot load long model: {e}"}))
    sys.exit(1)

try:
    with open('model_short.pkl', 'rb') as f:
        model_short = joblib.load(f)
except Exception as e:
    print(json.dumps({"error": f"Cannot load short model: {e}"}))
    sys.exit(1)

try:
    with open('model_flat.pkl', 'rb') as f:
        model_flat = joblib.load(f)
except Exception as e:
    print(json.dumps({"error": f"Cannot load flat model: {e}"}))
    sys.exit(1)

# === Получение данных из аргумента ===

if len(sys.argv) < 2:
    print(json.dumps({"error": "No features provided"}))
    sys.exit(1)

try:
    fd = json.loads(sys.argv[1])
except Exception as e:
    print(json.dumps({"error": f"JSON parse error: {e}"}))
    sys.exit(1)

# === Проверка наличия всех нужных признаков ===

missing_long  = [f for f in FEATURES_LONG  if f not in fd]
missing_short = [f for f in FEATURES_SHORT if f not in fd]
missing_flat = [f for f in FEATURES_FLAT if f not in fd]

if missing_long:
    print(json.dumps({"error": f"Missing long features: {missing_long}"}))
    sys.exit(1)

if missing_short:
    print(json.dumps({"error": f"Missing short features: {missing_short}"}))
    sys.exit(1)

if missing_flat:
    print(json.dumps({"error": f"Missing flat features: {missing_flat}"}))
    sys.exit(1)

# === Предсказание ===

X_long  = pd.DataFrame([fd])[FEATURES_LONG]
X_short = pd.DataFrame([fd])[FEATURES_SHORT]
X_flat = pd.DataFrame([fd])[FEATURES_FLAT]

prob_long  = round(float(model_long.predict_proba(X_long)[0][1]),  2)
prob_short = round(float(model_short.predict_proba(X_short)[0][1]), 2)
prob_flat = round(float(model_flat.predict_proba(X_flat)[0][1]), 2)

# === Вызов PHP ===

try:
    result = subprocess.run(
        ["php", "scan_result.php", str(prob_long), str(prob_short), str(prob_flat)],
        capture_output=True,
        text=True,
        timeout=30
    )
    print(result.stdout)
    if result.stderr:
        print(f"PHP stderr: {result.stderr}", file=sys.stderr)
except subprocess.TimeoutExpired:
    print(json.dumps({"error": "PHP timeout"}))
    sys.exit(1)
except Exception as e:
    print(json.dumps({"error": f"PHP call failed: {e}"}))
    sys.exit(1)