from datetime import datetime, timedelta

from institute.models import TransferOwnershipHistory


class InstituteTestHelper:
    createInstituteURL = "/institute/create"
    deleteInstituteURL = "/institute/delete"
    instituteAllList = "/institute/all"
    generate_APIKey_url = "/institute/api_key/generate"
    APIKeys_list_url = "/institute/api_key/list"
    delete_APIKey_url = "/institute/api_key/delete"
    get_token_from_APIKey_url = "/institute/api_key/get_token"
    set_institute_student = "/institute/student/set"
    get_institute_student = "/institute/student/get"
    list_institute_student = "/institute/student/list"
    institute_balance = "/institute/balance"
    #TODO : skip
    # instituteOwnedList = "/institute/owned"
    # transferRequest = "/institute/transfer/request"
    # transferState = "/institute/transfer/state"
    # transferNewOwnerConfirm = "/institute/transfer/noc"
    # transferOldOwnerConfirm = "/institute/transfer/ooc"

    def __init__(self, tester):
        self.tester = tester

    name_index = 0

    def new_name(self):
        self.name_index += 1
        return 'new_name' + str(self.name_index)

    def create_institute(self, name=None, token=None):
        if name is None:
            name = self.new_name()
        if token is None:
            token = self.tester.default_test_token
        (response_data, status_code, error_message) = self.tester.post_with_token(self.createInstituteURL, {'name': name},
                                                                                  test_token=token)
        self.tester.assertEqual('ok', response_data['status'], error_message)
        return response_data['institute']

    def delete_institute(self, institute_id):
        self.tester.post_with_token(self.deleteInstituteURL, {'institute_id': institute_id})

    def transfer_ownership_of_institute_ooc_success(self, institute_id, user2_id, user2_email):
        (response_data, status_code, error_message) = self.tester.post_with_token(self.transferRequest, {'institute_id': institute_id,
                                                                                                         'new_owner_email': user2_email})
        self.tester.assertEqual('Successful', response_data['message'], error_message)

        old_owner_accept_key = TransferOwnershipHistory.objects.filter(new_owner=user2_id)[0].old_owner_accept_key
        (response_data, status_code, error_message) = self.tester.post_with_token(self.transferOldOwnerConfirm,
                                                                                  {'accept_key': old_owner_accept_key})
        self.tester.assertEqual('Successful', response_data['message'], error_message)

    def transfer_ownership_of_institute(self, institute_id, user2_id, user2_email, user2_token):
        self.transfer_ownership_of_institute_ooc_success(institute_id, user2_id, user2_email)

        new_owner_accept_key = TransferOwnershipHistory.objects.filter(new_owner=user2_id)[0].new_owner_accept_key
        (response_data, status_code, error_message) = self.tester.post_with_token(self.transferNewOwnerConfirm,
                                                                                  {'accept_key': new_owner_accept_key},
                                                                                  test_token=user2_token)
        self.tester.assertEqual('The institute has been transferred to your account.', response_data['message'], error_message)

    def check_transfer_state(self, old_owner_accept, new_owner_accept, institute_id):
        (response_data, status_code, error_message) = self.tester.post_with_token(self.transferState, {
            'institute_id': institute_id})
        self.tester.assertEqual(response_data['message'], 'Successful', error_message)
        self.tester.assertEqual(response_data['data']['new_owner_accept'], new_owner_accept, error_message)
        self.tester.assertEqual(response_data['data']['old_owner_accept'], old_owner_accept, error_message)

    def generate_api_key(self, institute_id):
        (response_data, status_code, error_message) = self.tester.post_with_token(self.generate_APIKey_url, {
            'institute_id': institute_id,
            'roles': '["__ROLE_ADMIN__"]',
            'expire_at': datetime.now() + timedelta(days=30)
        })
        self.tester.assertEqual('ok', response_data['status'], error_message)
        return response_data['data']['api_key']

    def create_institute_student(self, api_key, referer_institute_student_identity, validate_success=True):
        (response_data, status_code, error_message) = self.tester.post_without_token(self.set_institute_student, {
            'api_key': api_key,
            'referer_institute_student_identity': referer_institute_student_identity
        })

        if validate_success:
            self.tester.assertEqual('ok', response_data['status'], error_message)
            self.tester.assertEqual('Successful', response_data['message'], error_message)
            self.tester.assertEqual(referer_institute_student_identity,
                                    response_data['data']['institute_student']['referer_institute_student_identity'], error_message)
            self.tester.assertIsNone(response_data['data']['institute_student']['first_name'], error_message)

            return response_data['data']['institute_student']['wikiazma_institute_student_identity']
        else:
            return response_data, status_code, error_message
