import os
from http import HTTPStatus
from typing import _ProtocolMeta
from fastapi.responses import JSONResponse
from restful.services import ForecastingService
from restful.schemas import ForecastingServiceSchema


# Forecasting Controller
class ForecastingControllers:

    __SERVICE: ForecastingService = ForecastingService()


    # Algorithms Controller
    async def algorithms_controller(self) -> JSONResponse:
        try:
            algorithms: list = sorted(
                os.listdir("resources/algorithms"))

            return JSONResponse(
                content = {
                    'message': 'Success',
                    'status_code': HTTPStatus.OK,
                    'data': algorithms
                },
                status_code = HTTPStatus.OK
            )

        except Exception as error_message:
            print(error_message)
            return JSONResponse(
                content = {
                    'message': 'Internal Server Error',
                    'status_code': HTTPStatus.INTERNAL_SERVER_ERROR,
                    'data': None
                },
                status_code = HTTPStatus.INTERNAL_SERVER_ERROR
            )



    # Currency Controller
    async def currencies_controller(self) -> JSONResponse:
        try:
            path: str = 'resources/datasets'
            datasets: list = sorted(
                [
                    item.replace(".csv", "") for item in os.listdir(path)
                    if os.path.isfile(os.path.join(path, item)) 
                        and item.endswith('.csv')
                ]
            )

            return JSONResponse(
                content = {
                    'message': 'Success',
                    'status_code': HTTPStatus.OK,
                    'data': datasets
                },
                status_code = HTTPStatus.OK
            )

        except Exception as error_message:
            print(error_message)
            return JSONResponse(
                content = {
                    'message': 'Internal Server Error',
                    'status_code': HTTPStatus.INTERNAL_SERVER_ERROR,
                    'data': None
                },
                status_code = HTTPStatus.INTERNAL_SERVER_ERROR
            )



    # Forecasting Controller
    async def forecasting_controller(self, payload: ForecastingServiceSchema,
        caching: _ProtocolMeta) -> JSONResponse:
        try:
            path: str = 'resources/datasets'
            datasets: list = sorted(
                [
                    item.replace(".csv", "") for item in os.listdir(path)
                    if os.path.isfile(os.path.join(path, item)) and item.endswith('.csv')
                ]
            )

            if payload.currency not in datasets:
                return JSONResponse(
                    content = {
                        'message': f'symbols "{payload.currency}" is not available.',
                        'status_code': HTTPStatus.BAD_REQUEST,
                        'data': None
                    },
                    status_code = HTTPStatus.BAD_REQUEST
                )


            if (payload.days > 31) or (payload.days < 1):
                return JSONResponse(
                    content = {
                        'message': 'days cannot be more than a month and cannot be less than 1',
                        'status_code': HTTPStatus.BAD_REQUEST,
                        'data': None
                    },
                    status_code = HTTPStatus.BAD_REQUEST
                )


            if payload.algorithm not in os.listdir("resources/algorithms"):
                return JSONResponse(
                    content = {
                        'message': f'algorithm "{payload.algorithm}" is not available.',
                        'status_code': HTTPStatus.BAD_REQUEST,
                        'data': None
                    },
                    status_code = HTTPStatus.BAD_REQUEST
                )


            prediction: dict = await self.__SERVICE.forecasting(
                payload = payload, caching = caching)

            if not prediction :
                return JSONResponse(
                    content = {
                        'message': 'prediction could not be generated, please try again.',
                        'status_code': HTTPStatus.BAD_REQUEST,
                        'data': None
                    },
                    status_code = HTTPStatus.BAD_REQUEST
                )

            return JSONResponse(
                content = {
                    'message': 'prediction success',
                    'status_code': HTTPStatus.OK,
                    'data': {
						'currency': payload.currency,
						'predictions': prediction
					}
                },
                status_code = HTTPStatus.OK
            )

        except Exception as error_message:
            print(error_message)
            return JSONResponse(
                content = {
                    'message': 'internal server error',
                    'status_code': HTTPStatus.INTERNAL_SERVER_ERROR,
                    'data': None
                },
                status_code = HTTPStatus.INTERNAL_SERVER_ERROR
            )