import os

from flask import request, jsonify, abort, Response
from flask_restful import Resource

from app.entity.product.ChartDataBean import *

from app.processor.strategy.StrategyDataLoader import *
from app.processor.strategy.StrategyCalculatorProcessor import *

from app.resource.ResultWrapper import *
from app.resource.ResponseBuilder import *

# shows a list of all todos, and lets you POST to add new tasks
class Strategies(Resource):
    # load strategy by name
    def get(self, strategyName):
        name = strategyName

        userId = request.headers.get('token')
        if userId is None or userId == "":
            userId = 'guest'
            
        if name is None:
            strategyDict = StrategyDataLoader.getStrategies(userId, None)
            resultWrapper = ResultWrapper(strategyDict)
            return ResponseBuilder.build(resultWrapper)

            
        strategyCalculatorDataBean = StrategyDataLoader.load(userId, name)
        if strategyCalculatorDataBean is not None:
            StrategyCalculatorProcessor.calculateOptions(strategyCalculatorDataBean)
            StrategyCalculatorProcessor.calculateOptionsByDaysElapsed(strategyCalculatorDataBean)
            
            chartResult = StrategyCalculatorProcessor.calculateChart(strategyCalculatorDataBean)
            strategyCalculatorDataBean.chartDataBean = chartResult
        else:
            strategyCalculatorDataBean = StrategyCalculatorDataBean()
        
        resultWrapper = ResultWrapper(strategyCalculatorDataBean)
        return ResponseBuilder.build(resultWrapper)
    
    # delete strategy by name
    def delete(self, strategyName):
        userId = request.headers.get('token')
        if userId is None or userId == "" or userId == 'guest':
            abort(500)

        name = strategyName

        strategyCalculatorDataBean = StrategyDataLoader.delete(userId, name)
        
        StrategyCalculatorProcessor.calculateOptions(strategyCalculatorDataBean)
        StrategyCalculatorProcessor.calculateOptionsByDaysElapsed(strategyCalculatorDataBean)
        
        chartResult = StrategyCalculatorProcessor.calculateChart(strategyCalculatorDataBean)
        strategyCalculatorDataBean.chartDataBean = chartResult
    
        resultWrapper = ResultWrapper(strategyCalculatorDataBean)
        return ResponseBuilder.build(resultWrapper)        

    # create or update strategy
    def put(self, strategyName):
        parameters = request.get_json(force=True)
        name = strategyName
        
        userId = request.headers.get('token')
        if userId is None or userId == "" or userId == 'guest':
            abort(500)
            
    
        strategyCalculatorDataBean =  StrategyCalculatorDataBeanBuilder.build(parameters)
        strategyCalculatorDataBean.name = name
        
        StrategyCalculatorProcessor.calculateOptions(strategyCalculatorDataBean)
        StrategyCalculatorProcessor.calculateOptionsByDaysElapsed(strategyCalculatorDataBean)
        
        chartResult = StrategyCalculatorProcessor.calculateChart(strategyCalculatorDataBean)
        strategyCalculatorDataBean.chartDataBean = ChartDataBean()
    
        StrategyDataLoader.save(userId, name, strategyCalculatorDataBean)
        
        strategyCalculatorDataBean.chartDataBean = chartResult

        resultWrapper = ResultWrapper(strategyCalculatorDataBean)
        return ResponseBuilder.build(resultWrapper)        
        
    # create
    def post(self, strategyName):
        abort(500)
