from os import name
from fastapi import APIRouter, Depends, HTTPException
from starlette.responses import Response

from ... import TimeseriesFactory
from ...algorithm import DbDtAlgorithm
from ...residual import (
    calculate,
    Reading,
)
from .DataApiQuery import DataApiQuery
from .data import format_timeseries, get_data_factory, get_data_query, get_timeseries


router = APIRouter()


@router.get(
    "/algorithms/dbdt/",
    description="First order derivative at requested interval",
    name="Dbdt Algorithm",
)
def get_dbdt(
    query: DataApiQuery = Depends(get_data_query),
) -> Response:
    dbdt = DbDtAlgorithm(period=query.sampling_period)
    data_factory = get_data_factory(query=query)
    # read data
    raw = get_timeseries(data_factory, query)
    # run dbdt
    timeseries = dbdt.process(raw)
    elements = [f"{element}_DT" for element in query.elements]
    # output response
    return format_timeseries(
        timeseries=timeseries, format=query.format, elements=elements
    )


@router.post(
    "/algorithms/residual",
    description="Caclulates new absolutes and baselines from reading\n\n"
    + "Returns posted reading object with updated values",
    response_model=Reading,
)
def calculate_residual(reading: Reading, adjust_reference: bool = True):
    try:
        return calculate(reading=reading, adjust_reference=adjust_reference)
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))