"""
Sylunara Signals Strategy for Freqtrade
Consumes the live book from sylunara-signals.crypto-guard.workers.dev and enters
positions that Sylunara is already holding.

Setup:
  1. Drop this file in user_data/strategies/
  2. Add "SylunaraSignals" to your strategy list in config.json
  3. Works with any pair that Sylunara publishes (BTC, SOL, UNI, etc.)

The feed is free, public, and hash-chained. We publish what we hold,
after we hold it. This is disclosure, not advice.
"""

import json
import logging
from urllib.request import urlopen

from freqtrade.strategy import IStrategy

logger = logging.getLogger(__name__)

FEED_URL = "https://sylunara-signals.crypto-guard.workers.dev/signals.json"


class SylunaraSignals(IStrategy):
    timeframe = "1h"
    minimal_roi = {"0": 0.05, "120": 0.03, "240": 0.02, "480": 0.01}
    stoploss = -0.08

    def populate_indicators(self, dataframe, metadata):
        dataframe["sylunara_long"] = 0
        try:
            from urllib.request import Request
            req = Request(FEED_URL, headers={
                "Accept": "application/json",
                "User-Agent": "freqtrade/2024.10",
            })
            resp = urlopen(req, timeout=10)
            book = json.loads(resp.read())
            pair = metadata["pair"].replace("/", "").upper()
            for pos in book.get("book", []):
                sym = pos["symbol"].replace("/", "").replace("USD", "USDT")
                if sym in pair and pos["direction"] == "long":
                    dataframe.loc[dataframe.index[-1], "sylunara_long"] = 1
                    logger.info(f"Sylunara is LONG {pair}")
        except Exception as e:
            logger.warning(f"Could not fetch Sylunara feed: {e}")
        return dataframe

    def populate_entry_trend(self, dataframe, metadata):
        dataframe.loc[
            (dataframe["sylunara_long"] == 1),
            ["enter_long", "enter_tag"],
        ] = (1, "sylunara_signal")
        return dataframe

    def populate_exit_trend(self, dataframe, metadata):
        dataframe.loc[
            (dataframe["sylunara_long"] == 0),
            ["exit_long", "exit_tag"],
        ] = (1, "sylunara_exit")
        return dataframe
