from flask import Flask, request, make_response, jsonify, send_from_directory, abort
from flask_httpauth import HTTPBasicAuth
from flask_mysqldb import MySQL
import logging
import pandas as pd
from configparser import ConfigParser
from datetime import datetime

logging.basicConfig(filename='/var/www/html/logs/credits_histories.log',
                    filemode='a',
                    format='%(asctime)s %(name)s %(levelname)s %(message)s',
                    level=logging.INFO)

#Read config.ini file
config_object = ConfigParser()
config_object.read("config.ini")

#Get info
live_hellio_info = config_object["live_hellio"]
authinfo = config_object["auth"]
savepathinfo = config_object['savepath']


app = Flask(__name__)

mysql = MySQL(app)

auth = HTTPBasicAuth()

USER_DATA = {
    str(authinfo["username"]): str(authinfo["password"])
}

@auth.verify_password
def verify(username, password):
    if not (username and password):
        return False
    return USER_DATA.get(username) == password

# user balance
@app.route('/balance/', methods=['POST', 'GET'])
@auth.login_required
def balance():
    app.config['MYSQL_HOST'] = str(live_hellio_info["host"])
    app.config['MYSQL_USER'] = str(live_hellio_info["user"])
    app.config['MYSQL_PASSWORD'] = str(live_hellio_info["password"])
    app.config['MYSQL_DB'] = str(live_hellio_info["db"])
    if request.method == 'POST':
        req = request.get_json()
        user_id = req['user_id']
        user_id = int(user_id)
        username = req['username'].strip()
        cur = mysql.connection

        try:
            credits_data = pd.read_sql("SELECT * FROM credit_histories WHERE user_id={} AND username='{}' ORDER BY created_at desc".format(user_id, username), cur)
            now_time = datetime.utcnow().strftime('%Y%m%d%H%M')
            save_path = "{}{}-balance-{}.xlsx".format(savepathinfo['savepath'], username, now_time)
            credits_data.to_excel(save_path, index=True)
            credits_data = credits_data.to_dict(orient='records')
            if not len(credits_data):
                return make_response(jsonify(code=404, error="user credits info does not exist"), 200)

        except Exception as e:
            logging.info(e)
            cur.close()
            return make_response(jsonify(code=404, error="user credits info does not exist"), 200)
       
        return make_response(jsonify(code=200, 
                                     balance=credits_data[0]['new_bal'], 
                                     credit_history=credits_data,
                                     _path = save_path
                                     ),200)


        

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