import json


import requests
from django.http import HttpResponse
from utilityservice.data.response.nwisefinerror import NWisefinError
from utilityservice.data.response.nwisefinerrorconstants import ErrorMessage, ErrorDescription
from npayroll import settings


KVB_URL = str(settings.CMS_BE_URL)


class Authentication:
    url = None
    token = None
    header = {"Content-Type": "application/json"}
    multipart = None
    body = None
    files = None

    def set_url(self, url):
        self.url = url

    def set_token(self, token):
        self.token = token

    def set_header(self, header):
        self.header = header

    def set_body(self, body):
        self.body = body

    def set_files(self, files):
        self.files = files

    def set_query(self, query_name, query_value):
        q_contains = '?'
        query_flag = False
        for x in self.url:
            if x == q_contains:
                query_flag = True
        if query_flag:
            if query_value is None or query_value == '':
                self.url = str(self.url) + '&' + str(query_name) + '='
            else:
                self.url = str(self.url) + '&' + str(query_name) + '=' + str(query_value)
        else:
            if query_value is None or query_value == '':
                self.url = str(self.url) + '?' + str(query_name) + '='
            else:
                self.url = str(self.url) + '?' + str(query_name) + '=' + str(query_value)

    def set_page(self, page_value):
        q_contains = '?'
        query_flag = False
        for x in self.url:
            if x == q_contains:
                query_flag = True
        if query_flag:
            if page_value is None or page_value == '':
                self.url = str(self.url) + '&page=1'
            else:
                self.url = str(self.url) + '&page=' + str(page_value)
        else:
            if page_value is None or page_value == '':
                self.url = str(self.url) + '?page=1'
            else:
                self.url = str(self.url) + '?page=' + str(page_value)

    def generate_user(self):
        if self.token is None:
            user = self.get_NAC_token()
            self.token = user['token']
            self.header = {"Content-Type": "application/json", "Authorization": "Token " + str(user['token']) + ""}
            return self.token
        else:
            return self.token

    def get_url(self):
        full_url = KVB_URL + str(self.url)
        return full_url

    def get_token(self):
        return self.token

    def get_header(self):
        return self.header

    def get_body(self):
        return self.body

    def get_file(self):
        return self.files

    def post_request(self, url, header, body):
        response = requests.post(KVB_URL + str(url), headers=header, data=body, verify=True)
        return response

    def get_request(self, url, header):
        response = requests.get(KVB_URL + str(url), headers=header, verify=True)
        return response

    def del_request(self, url, header):
        response = requests.delete(KVB_URL + str(url), headers=header, verify=True)
        return response

    def post_call(self):
        response_data = requests.post(KVB_URL + str(self.url), headers=self.header, data=self.body, verify=True)
        response = HttpResponse(response_data, content_type="application/json")
        return response

    def get_call(self):
        response_data = requests.get(KVB_URL + str(self.url), headers=self.header, verify=True)
        response = HttpResponse(response_data, content_type="application/json")
        return response

    def delete_call(self):
        response_data = requests.delete(KVB_URL + str(self.url), headers=self.header, verify=True)
        response = HttpResponse(response_data, content_type="application/json")
        return response

    def get_NAC_token(self):
        resp = NWisefinError()
        user_id = 'Vsolvuser'
        password = '1234'
        entity_id = '1'
        auth_body = {'username': user_id, 'password': password, 'entity_id': entity_id}
        auth_headers = {"Content-Type": "application/json"}
        auth_token = requests.post(KVB_URL + 'usrserv/auth_token', headers=auth_headers, data=json.dumps(auth_body),
                                   verify=False)
        if auth_token.status_code != 200:
            resp.set_code(ErrorMessage.SERVER_ERROR)
            resp.set_description(ErrorDescription.SERVER_ERROR)
            return resp
        val = json.loads(auth_token.text)
        token = val['token']
        data = {'token': token, 'url': KVB_URL}
        return data
