"""
Persistent bot state: saved/loaded from JSON so the bot survives restarts.
"""
import json
import logging
import os
from dataclasses import asdict
from typing import Optional

from tabdeal_bot.exchange.models import BotState, Direction, TradeResult

logger = logging.getLogger(__name__)


def _direction_from_str(s: str) -> Direction:
    try:
        return Direction(s)
    except ValueError:
        return Direction.NONE


def _result_from_str(s: Optional[str]) -> Optional[TradeResult]:
    if s is None:
        return None
    try:
        return TradeResult(s)
    except ValueError:
        return None


class StateManager:
    def __init__(self, state_file: str):
        self.state_file = state_file
        self.state = BotState()
        self._load()

    def _load(self):
        if os.path.exists(self.state_file):
            try:
                with open(self.state_file, "r") as f:
                    d = json.load(f)
                self.state.current_direction = _direction_from_str(d.get("current_direction", "NONE"))
                self.state.consecutive_losses = d.get("consecutive_losses", 0)
                self.state.consecutive_wins = d.get("consecutive_wins", 0)
                self.state.daily_pnl = d.get("daily_pnl", 0.0)
                self.state.total_pnl = d.get("total_pnl", 0.0)
                self.state.peak_balance = d.get("peak_balance", 0.0)
                self.state.is_running = d.get("is_running", True)
                self.state.daily_loss_halt = d.get("daily_loss_halt", False)
                self.state.drawdown_halt = d.get("drawdown_halt", False)
                self.state.open_trade_id = d.get("open_trade_id")
                self.state.last_trade_result = _result_from_str(d.get("last_trade_result"))
                self.state.trades_today = d.get("trades_today", 0)
                logger.info("State loaded from %s", self.state_file)
            except Exception as e:
                logger.warning("Could not load state: %s — starting fresh", e)

    def save(self):
        os.makedirs(os.path.dirname(self.state_file) or ".", exist_ok=True)
        d = {
            "current_direction": self.state.current_direction.value,
            "consecutive_losses": self.state.consecutive_losses,
            "consecutive_wins": self.state.consecutive_wins,
            "daily_pnl": self.state.daily_pnl,
            "total_pnl": self.state.total_pnl,
            "peak_balance": self.state.peak_balance,
            "is_running": self.state.is_running,
            "daily_loss_halt": self.state.daily_loss_halt,
            "drawdown_halt": self.state.drawdown_halt,
            "open_trade_id": self.state.open_trade_id,
            "last_trade_result": self.state.last_trade_result.value if self.state.last_trade_result else None,
            "trades_today": self.state.trades_today,
        }
        with open(self.state_file, "w") as f:
            json.dump(d, f, indent=2)

    def reset_daily(self):
        self.state.daily_pnl = 0.0
        self.state.daily_loss_halt = False
        self.state.trades_today = 0
        self.save()
