"""
Simple test API for data management
"""

import json
from typing import List
from fastapi import APIRouter, Depends, HTTPException, \
                    File, UploadFile
from sqlalchemy.orm import Session
from sqlalchemy.engine import Engine
from . import crud, schemas
from toardb.utils.database import ToarDbSession, engine, get_engine, get_db

router = APIRouter()

# plain views to post and get data

#get all data of table data
@router.get('/data/', response_model=List[schemas.Data])
def get_all_data(skip: int = 0, limit: int = None, db: Session = Depends(get_db)):
    data = crud.get_all_data(db, skip=skip, limit=limit)
    return data

#get all data of one timeseries
@router.get('/data/{timeseries_id}', response_model=List[schemas.Data])
def get_data(timeseries_id: int, db: Session = Depends(get_db)):
    db_data = crud.get_data(db, timeseries_id=timeseries_id)
    if db_data is None:
        raise HTTPException(status_code=404, detail="Data not found.")
    return db_data

#some more gets to be tested:
# - get all data of one special timestamp
# - get all data of one special timestamp and timeseries
# - ...

@router.post('/data/', response_model=schemas.DataCreate)
async def create_data(file: UploadFile = File(...), db: Session = Depends(get_db), engine: Engine = Depends(get_engine)):
#   # the next three lines are automatically done by database management,
#   # but we do want helpful error messages!
#   db_data = crud.get_data_by_datetime_and_timeseriesid(db, datetime=data.datetime, timeseries_id=data.timeseries_id)
#   if db_data:
#       raise HTTPException(status_code=400, detail="Data already registered.")

#   BUT:
#   we want to upload a whole file!
#
    response = crud.create_data(db, engine, input_handle=file)
    if response.status_code != 200:
        msg = response.body.decode('utf-8')
        # try to parse error messages from DBS (to be more understandable)
        msg2 = '"An error occurred in data insertion: <class \'psycopg2.errors.UniqueViolation\'>"'
        if (msg == msg2):
            msg = 'Data for timeseries already registered.'
        raise HTTPException(status_code=400, detail=msg)
    return response