from contextlib import closing
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
from flask_restful import reqparse, Api, Resource

from app.resource.strategy.Strategy import Strategy
from app.resource.strategy.Strategies import Strategies
from app.resource.strategy.StrategyList import StrategyList
from app.resource.strategy.StrategiesList import StrategiesList

from app.resource.stockprofiling.StockProfiling import StockProfiling
from app.resource.impliedvolatility.ImpliedVolatility import ImpliedVolatility

#configuration
DATABASE = '/tmp/flaskr.db'
#DEBUG = True
DEBUG = False
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

#app = Flask(__name__)
app = Flask(__name__, static_url_path='')
app.config.from_object(__name__)
app.config.from_envvar('FLASKR_SETTINGS', silent= True)

if __name__ == '__main__':
    app.run()


@app.after_request
def apply_caching(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization,token'
    response.headers['Access-Control-Expose-Headers'] = 'token'
    response.headers['Access-Control-Request-Headers'] = 'token'
    response.headers['Access-Control-Allow-Methods'] = 'HEAD, GET, PUT, POST, OPTIONS, DELETE'
    
    return response
    
    
# /calculator
api = Api(app)

api.add_resource(Strategy, '/strategy/<string:prefix>', endpoint = 'strategy')
api.add_resource(StrategyList, '/strategy', endpoint = 'StrategyList')

api.add_resource(Strategies, '/strategies/<string:strategyName>', endpoint = 'strategies')
api.add_resource(StrategiesList, '/strategies', endpoint = 'StrategiesList')

api.add_resource(StockProfiling, '/stockprofiling/<string:stockTicker>', endpoint = 'stockprofiling')
api.add_resource(ImpliedVolatility, '/impliedvolatility/<string:stockTicker>', endpoint = 'impliedvolatility')

# /configure/*
from app.resource.systemconfig.SystemConfigResource import mod as configureModule
app.register_blueprint(configureModule)

# /calculator/calc
from app.resource.calculator.OptionCalculatorResource import mod as calculatorModule
app.register_blueprint(calculatorModule)

# /strategy/calc
from app.resource.strategy.StrategyCalculatorResource import mod as strategyModule
app.register_blueprint(strategyModule)

# /simulation/calc
from app.resource.simulation.SimulationCalculatorResource import mod as simulationModule
app.register_blueprint(simulationModule)
