from fastapi import APIRouter, Depends
from api.common import api_response, api_abort
from api.command_helpers import enqueue_tx_command
import command_transmit_sine
from context import AppContext, get_ctx

router = APIRouter()



@router.get("/", summary="Get Radio Parameters", tags=["Radio"], responses={
    200: {
        "description": "Current radio parameters.",
        "content": {
            "application/json": {
                "example": {
                    "radio_frequency": "14093000",
                    "radio_mode": "PKTUSB",
                    "radio_rf_level": 100,
                    "radio_status": True,
                    "radio_swr": 0,
                    "radio_tuner": False,
                    "s_meter_strength": "20"
                }
            }
        }
    },
    404: {
        "description": "The requested resource was not found.",
        "content": {
            "application/json": {
                "example": {
                    "error": "Resource not found."
                }
            }
        }
    }
})
async def get_radio(ctx: AppContext = Depends(get_ctx)):
    """
    Retrieve current radio parameters.

    Returns:
        dict: The current radio parameters.
    """
    params = ctx.state_manager.get_radio_status()
    if params is None:
        api_abort("Radio parameters not found", 404)
    return api_response(params)

@router.post("/", summary="Set Radio Parameters", tags=["Radio"], responses={
    200: {
        "description": "Radio parameters updated successfully.",
        "content": {
            "application/json": {
                "example": {
                    "radio_frequency": "14093000",
                    "radio_mode": "PKTUSB",
                    "radio_rf_level": 100,
                    "radio_status": True,
                    "radio_swr": 0,
                    "radio_tuner": True,
                    "s_meter_strength": "20"
                }
            }
        }
    },
    400: {
        "description": "Bad Request: The request was malformed or missing required parameters.",
        "content": {
            "application/json": {
                "example": {
                    "error": "Invalid parameters."
                }
            }
        }
    },
    404: {
        "description": "The requested resource was not found.",
        "content": {
            "application/json": {
                "example": {
                    "error": "Resource not found."
                }
            }
        }
    }
})
async def post_radio(
    new_params: dict,
    ctx: AppContext = Depends(get_ctx),
):
    """
    Set radio parameters: frequency, mode, RF level, tuner state.

    Parameters:
        new_params (dict): The radio parameters to set.
        ctx (AppContext): Injected application context.

    Returns:
        dict: The applied radio parameters.
    """
    radio_manager = ctx.radio_manager
    if "radio_frequency" in new_params:
        radio_manager.set_frequency(new_params["radio_frequency"])
    if "radio_mode" in new_params:
        radio_manager.set_mode(new_params["radio_mode"])
    if "radio_rf_level" in new_params:
        radio_manager.set_rf_level(int(new_params["radio_rf_level"]))
    if "radio_tuner" in new_params:
        radio_manager.set_tuner(new_params["radio_tuner"])
    return api_response(new_params)


@router.post("/tune", summary="Enable/Disable Radio Tuning", tags=["Radio"], responses={
    200: {
        "description": "Radio tuning status updated successfully.",
        "content": {
            "application/json": {
                "example": {
                    "enable_tuning": True
                }
            }
        }
    },
    400: {
        "description": "Bad Request: The request was malformed or missing required parameters.",
        "content": {
            "application/json": {
                "example": {
                    "error": "Invalid parameters."
                }
            }
        }
    },
    404: {
        "description": "The requested resource was not found.",
        "content": {
            "application/json": {
                "example": {
                    "error": "Resource not found."
                }
            }
        }
    },
    503: {
        "description": "Modem not running or busy.",
        "content": {
            "application/json": {
                "examples": {
                    "modem_not_running": {
                        "summary": "Modem Not Running",
                        "value": {
                            "error": "Modem not running."
                        }
                    },
                    "modem_busy": {
                        "summary": "Modem Busy",
                        "value": {
                            "error": "Modem Busy."
                        }
                    }
                }
            }
        }
    }
})
async def post_radio_tune(
    params: dict,
    ctx: AppContext = Depends(get_ctx),
):
    """
    Enable or disable radio tuning tone.

    Parameters:
        params (dict): {'enable_tuning': bool}
        ctx (AppContext): Injected application context.

    Raises:
        HTTPException via api_abort if modem not running or busy.
    """
    enable = params.get("enable_tuning")
    if enable:
        if not ctx.state_manager.is_modem_running:
            api_abort("Modem not running", 503)
        await enqueue_tx_command(ctx, command_transmit_sine.TransmitSine)
    else:
        ctx.rf_modem.stop_sine()
    return api_response(params)
    return api_response(data)
