import math

from fastapi import APIRouter, HTTPException, Query

from db.crud import *
from db.models import ExperimentData
from db.repositories import get_exp_data_by_file_id, get_all_exp_data
from network.schemas import ExperimentDataBody

router = APIRouter()


@router.post('/create')
async def create_experiment_data(body: ExperimentDataBody):
    try:
        await create(ExperimentData,
                     direction=body.direction,
                     temperature=body.temperature,
                     nox=body.nox,
                     co2=body.co2,
                     co=body.co,
                     file_id=body.file_id
                     )

        return {"message": "Новая запись <ExperimentData> успешно добавлена"}
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")


@router.get('/all')
async def get_all_experiment_data(page: int = Query(ge=1, default=1),
                                  size: int = Query(ge = 1, le=100, default=15)):
    try:
        result = await get_all_exp_data(page, size)
        return {
            "items": result,
            "page": page,
            "size": size,
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")


@router.get('/{id}')
async def get_by_id_experiment_data(id: int):
    try:
        result = await get_by_id(ExperimentData, id)

        if result is not None:
            return result
        else:
            return {"message": "Запись <ExperimentData> не найдена"}
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")


@router.get('/file_id/{file_id}')
async def get_experiment_data_by_file_id(file_id: str):
    try:
        result = await get_exp_data_by_file_id(file_id)

        if result is not None:
            return result
        else:
            return {"message": f'<ExperimentData> с file_id = {id} - не найдены'}
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")


@router.delete('/{id}/delete')
async def delete_experiment_data(id: int):
    try:
        is_deleted = await delete(ExperimentData, id)
        if is_deleted:
            return {"message": "Запись <ExperimentData> успешно удалена"}
        else:
            return {"message": "Запись <ExperimentData> не найдена"}
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")