"""Default configuration for Koinkamu."""
import os

# Flask
SECRET_KEY = os.getenv('SECRET_KEY', 'koinkamu-dev-secret')
DEBUG = False

# MySQL Database (XAMPP) — Dual-database architecture
DB_HOST = os.getenv('DB_HOST', 'localhost')
DB_PORT = int(os.getenv('DB_PORT', 3306))
DB_USER = os.getenv('DB_USER', 'kamucoid_investasi')
DB_PASSWORD = os.getenv('DB_PASSWORD', 'qwe123,./')
DB_NAME_APP = os.getenv('DB_NAME_APP', 'kamucoid_investasi_app')

# Tri-database market architecture (per asset type)
DB_NAME_MARKET_CRYPTO = os.getenv('DB_NAME_MARKET_CRYPTO', 'kamucoid_investasi_market_crypto')
DB_NAME_MARKET_ID = os.getenv('DB_NAME_MARKET_ID', 'kamucoid_investasi_market_id')
DB_NAME_MARKET_US = os.getenv('DB_NAME_MARKET_US', 'kamucoid_investasi_market_us')

# Legacy (kept for migration reference)
DB_NAME_MARKET = os.getenv('DB_NAME_MARKET', 'kamucoid_investasi_market')
DB_NAME = os.getenv('DB_NAME', 'kamucoid_investasi')

def _db_uri(db_name):
    return f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{db_name}?charset=utf8mb4"

# Default URI → IDX market DB (will be switched per-request via USE).
# App tables are schema-qualified with APP_SCHEMA to always reach app DB.
# Market tables are unqualified → routed by USE statement per request.
# Default = Saham Indonesia (stock) as the primary market.
SQLALCHEMY_DATABASE_URI = _db_uri(DB_NAME_MARKET_ID)

SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ENGINE_OPTIONS = {
    'pool_size': 10,
    'pool_recycle': 3600,
    'pool_pre_ping': True,
}

# Multi-domain support
ALLOWED_HOSTS = [
    'investasi.kamu.co.id',
    'koin.kamu.co.id',
    'koinkamu.com',
    'koinkamu.id',
    'localhost',
    '127.0.0.1',
]

# --- Session Defaults (aman di semua environment) ---
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Lax'

# API Configuration
COINGECKO_BASE_URL = "https://api.coingecko.com/api/v3"
COINGECKO_API_KEY = os.getenv('COINGECKO_API_KEY', '')
COINGECKO_RATE_LIMIT_DELAY = 1.0  # seconds between requests (free tier)

INDODAX_BASE_URL = "https://indodax.com"
INDODAX_API_KEY = os.getenv('INDODAX_API_KEY', '')
INDODAX_API_SECRET = os.getenv('INDODAX_API_SECRET', '')
INDODAX_RATE_LIMIT_DELAY = 0.35  # seconds between requests

TOKOCRYPTO_BASE_URL = "https://www.tokocrypto.com"
TOKOCRYPTO_API_KEY = os.getenv('TOKOCRYPTO_API_KEY', '')
TOKOCRYPTO_API_SECRET = os.getenv('TOKOCRYPTO_API_SECRET', '')
TOKOCRYPTO_RATE_LIMIT_DELAY = 0.1  # seconds between requests (weight-based)

# Timeframe mappings (all providers)
TIMEFRAMES = {
    '1m': {'indodax': '1', 'tokocrypto': '1m', 'yahoo': '1m', 'label': '1 Menit', 'minutes': 1},
    '15m': {'indodax': '15', 'tokocrypto': '15m', 'yahoo': '15m', 'label': '15 Menit', 'minutes': 15},
    '30m': {'indodax': '30', 'tokocrypto': '30m', 'yahoo': '30m', 'label': '30 Menit', 'minutes': 30},
    '1h': {'indodax': '60', 'tokocrypto': '1h', 'yahoo': '1h', 'label': '1 Jam', 'minutes': 60},
    '4h': {'indodax': '240', 'tokocrypto': '4h', 'yahoo': '1h', 'label': '4 Jam', 'minutes': 240},
    '1D': {'indodax': '1D', 'tokocrypto': '1d', 'yahoo': '1d', 'label': '1 Hari', 'minutes': 1440},
    '1W': {'indodax': '1W', 'tokocrypto': '1w', 'yahoo': '1wk', 'label': '1 Minggu', 'minutes': 10080},
}

# CoinGecko OHLC timeframe mapping (days parameter → candle granularity)
COINGECKO_OHLC_DAYS = {
    '1m': 1,      # 30-min candles (closest available)
    '15m': 1,     # 30-min candles
    '30m': 1,     # 30-min candles
    '1h': 30,     # 4-hour candles
    '4h': 90,     # 4-hour candles
    '1D': 365,    # daily candles
    '1W': 365,    # daily candles (aggregate manually)
}

# Trading fees (Ajaib default)
DEFAULT_BUY_FEE_PCT = 0.31
DEFAULT_SELL_FEE_PCT = 0.31

# Capital management
DEFAULT_CAPITAL_IDR = 1_000_000
DEFAULT_ACTIVE_CAPITAL_PCT = 75.0
DEFAULT_RESERVE_CAPITAL_PCT = 25.0

# WIB timezone offset
WIB_UTC_OFFSET_HOURS = 7

# Default sync config per provider (overridable via Settings UI → AppSettings)
SYNC_CONFIG_DEFAULTS = {
    'coingecko': {
        'retry_max': 3,
        'retry_base_delay': 10.0,
        'retry_max_delay': 90.0,
        'rate_delay': 1.0,
        'timeout': 60,
    },
    'indodax': {
        'retry_max': 3,
        'retry_base_delay': 3.0,
        'retry_max_delay': 30.0,
        'rate_delay': 0.35,
        'timeout': 60,
    },
    'tokocrypto': {
        'retry_max': 3,
        'retry_base_delay': 2.0,
        'retry_max_delay': 30.0,
        'rate_delay': 0.1,
        'timeout': 60,
    },
}
SYNC_ITEM_MAX_ATTEMPTS = 2  # 1 initial + 1 retry at queue level

# Export
EXPORT_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'exports')

# --- ML Engine Tuning ---
# Override these in production.py for low-spec servers.
# Local compute is unlimited — maximize accuracy.
ML_GB_ESTIMATORS = 200          # GradientBoosting n_estimators (tradeoff speed/accuracy)
ML_TREE_ESTIMATORS = 300        # XGBoost/LightGBM/CatBoost n_estimators
ML_MAX_DEPTH = 8                # Max tree depth (was 6)
ML_SEQ_LENGTH = 24              # Sequence length for GB model
ML_RETRAIN_MINUTES = 60         # Retrain interval
ML_PREDICT_STEPS = 48           # Max prediction horizon (candles)
ML_OHLCV_LIMIT = 1000           # Max OHLCV candles to load (1000@1h = ~6 weeks)
ML_COMPUTE_MODE = os.getenv('ML_COMPUTE_MODE', 'view_only')  # 'live' or 'view_only'

# --- ML v2 Advanced Settings ---
ML_CV_SPLITS = 3                # TimeSeriesSplit folds (3 = fast, 5 = thorough)
ML_OPTUNA_TRIALS = 50           # Hyperparameter optimization trials
ML_MODEL_CACHE_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'model_cache')
ML_FEATURE_TOP_K = 30           # Top features to keep
ML_FEATURE_SELECTION_METHOD = 'fast'  # 'fast' (feature_importances_) or 'deep' (SHAP)
ML_DIRECTION_THRESHOLD = 0.65   # Min P(direction) to generate signal
ML_MIN_BACKTEST_WINRATE = 0.55  # Min winrate to accept strategy
ML_KELLY_FRACTION = 0.5         # Half-Kelly for safety

# --- Remote Sync (bidirectional local ↔ production) ---
SYNC_API_KEY = os.getenv('SYNC_API_KEY', '')
SYNC_REMOTE_URL = os.getenv('SYNC_REMOTE_URL', '')  # e.g. https://investasi.kamu.co.id
SYNC_BATCH_SIZE = int(os.getenv('SYNC_BATCH_SIZE', '1000'))
SYNC_MAX_BATCH_SIZE = 5000
SYNC_TIMEOUT = int(os.getenv('SYNC_TIMEOUT', '120'))  # seconds per request
SYNC_ENABLED = os.getenv('SYNC_ENABLED', 'false').lower() == 'true'
