from os import getenv
from pathlib import Path

from fastapi import FastAPI
from prometheus_fastapi_instrumentator import Instrumentator
from pydantic import BaseModel, Field

from ._meta import PACKAGE_PATH
from .predictor import (
    FuelType, SellingType, TransmissionType, PricePredictionFeatures, PricePredictor,
)


MODELS_PATH = getenv('MODELS_PATH', None)
if MODELS_PATH is not None:
    MODELS_PATH = Path(MODELS_PATH)
else:
    SERVICES_PATH = PACKAGE_PATH.parents[1]
    assert SERVICES_PATH.name == 'services'
    MODELS_PATH = SERVICES_PATH / 'models'

MODEL_PATH = MODELS_PATH / 'model.pkl'


predictor = PricePredictor(MODEL_PATH)


API_BASE_PATH = '/api'


app = FastAPI(
    title='Сервис ML',
    version='0.1.0',
    root_path=API_BASE_PATH,
    #redoc_url=None,
)


_ = (
    Instrumentator(excluded_handlers=['/metrics'])
    .instrument(app)
    .expose(app, endpoint='/metrics')
)


@app.get('/', summary='Тестовый эндпоинт')
async def root():
    return {'Hello': 'World'}


class PricePredictionRequest(BaseModel):

    selling_price: float = Field(..., gt=0)
    driven_kms: float = Field(..., ge=0)
    age: float = Field(..., ge=0)
    fuel_type: FuelType
    selling_type: SellingType
    transmission_type: TransmissionType


@app.post('/predict', summary='Предсказать цену подержанного автомобиля')
def predict_price(item_id: int, req: PricePredictionRequest):
    features = PricePredictionFeatures(
        selling_price=req.selling_price,
        driven_kms=req.driven_kms,
        age=req.age,
        fuel_type=req.fuel_type,
        selling_type=req.selling_type,
        transmission_type=req.transmission_type,
    )
    pred = predictor.predict(features)
    return {'item_id': item_id, 'price': pred}
