import csv
import html
from io import StringIO

import requests
from flask import Blueprint, request, Response, current_app

from inventory_provider.db import ims_data
from inventory_provider.db.ims import IMS
from inventory_provider.routes import common
from inventory_provider.tasks.ims_worker import OTRSFiles, export_data_for_otrs

routes = Blueprint("otrs", __name__)


@routes.after_request
def after_request(resp):
    return common.after_request(resp)


def get_otrs_output(result):

    with StringIO() as sio:
        writer = csv.writer(sio, delimiter='^')
        writer.writerows(result)
        data = sio.getvalue()
    return Response(
        response=data,
        status=requests.codes.ok,
        mimetype="text/html")


@routes.route('customer-companies')
def get_customer_companies_data():
    ims_config = current_app.config['INVENTORY_PROVIDER_CONFIG']["ims"]
    ds = IMS(ims_config['api'], ims_config['username'], ims_config['password'])
    return get_otrs_output(ims_data.otrs_get_customer_company_rows(ds))


@routes.route('customer-users')
def get_customer_users_data():
    ims_config = current_app.config['INVENTORY_PROVIDER_CONFIG']["ims"]
    ds = IMS(ims_config['api'], ims_config['username'], ims_config['password'])
    return_duplicates = request.args.get('duplicates', 'f').lower() == 'true'
    return get_otrs_output(ims_data.otrs_get_customer_users_rows(
        ds, return_duplicates=return_duplicates))


@routes.route('export')
def send_exports():
    files_value = request.args.get('files', None)
    duplicates = request.args.get('duplicates', 'f').lower() == 'true'
    if files_value:
        try:
            files_value = int(files_value)
        except ValueError:
            return Response(
                response=html.escape('<files> should be an Integer'),
                status=requests.codes.bad_request,
                mimetype="text/html")
        if files_value < 0 or files_value > sum(OTRSFiles):
            return Response(
                response=html.escape(f'Bad value for <files> {files_value}'),
                status=requests.codes.bad_request,
                mimetype="text/html")
    debug_uuid = export_data_for_otrs(
        files_to_export=files_value, export_duplicates=duplicates)
    return Response(
        response=f'Exports sent, search logs for {debug_uuid} for details',
        status=requests.codes.ok,
        mimetype="text/html")