#!/usr/bin/python
from __future__ import annotations

from typing import Optional, Text, List, Sequence, Tuple
from fastapi import FastAPI, File
import uvicorn

from odinson.ruleutils.info import info

# ruleutils imports HERE
from odinson.ruleutils import *

from pydantic import BaseModel
import yamls
import os
import argparse
import logging


class APIConfig(BaseModel):
    host: Text = "0.0.0.0"
    port: int = 8000

    @staticmethod
    def from_file(config_file: Text) -> "APIConfig":
        """
        Loads a conf instance from a YAML file
        """
        cfp = os.path.abspath(config_file)
        with open(cfp) as f:
            return APIConfig.from_str(config=f.read())

    @staticmethod
    def from_str(config: Text) -> "APIConfig":
        """
        Loads a conf instance based on the contents (str) of a YAML config file
        """
        config_dict = yaml.load(config, Loader=yaml.FullLoader).get("ruleutils")

        conf = APIConfig(host=config_dict["host"], port=config_dict["port"])

        return conf

if __name__ == "__main__":

    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument("-c", "--config", help="yaml config file")
    args = parser.parse_args()

    conf = APIConfig() if not args.config else APIConfig.from_file(args.config)

    server = FastAPI()

    # ruleutils-specific api endpoints HERE.

    @server.get("/api/version", response_model=Text)
    async def version():
        """
        App version
        """
        return info.version

    @server.get("/api/info")
    async def app_info():
        """
        App info
        """
        return info

    # Run server
    uvicorn.run(server, port=conf.port, host=conf.host)
