import random

from payment.models import UserBalanceHistory
from plan.models import AbstractUserPlan
from wikiazma.myTest import MyTestCase


class PlanTest(MyTestCase):

    def setUp(self):
        self.setUpHelpers()
        self.setBaseUser()

        if random.randint(0, 1):
            # final_price=10000, actual_price=12000
            self.abstract_user_plan = AbstractUserPlan.objects.create(name='testing_AbstractUserPlan', duration='365d', price=10000,
                                                                      actual_price=12000,
                                                                      active=True, wage_factor=0, tax_factor=0, min_wage_fee=0,
                                                                      max_institutes_per_user=0)
        else:
            # final_price=10000, actual_price=10000
            self.abstract_user_plan = AbstractUserPlan.objects.create(name='testing_AbstractUserPlan', duration='365d',
                                                                      actual_price=10000,
                                                                      active=True, wage_factor=0, tax_factor=0, min_wage_fee=0,
                                                                      max_institutes_per_user=0)

    def tearDown(self):
        self.user.delete()

    def test_list_plans_successful_response(self):
        (response_data, status_code, error_message) = self.post_with_token(self.planHelper.listAbstractUserPlanURL,
                                                                           {'skip': 0, 'take': 10})
        self.assertEqual(response_data['message'], 'Successful', error_message)
        self.assertEqual(len(response_data['data']['plans']), 1, error_message)

    def test_purchase_plans_successful_response(self):
        self.planHelper.purchase_abstract_user_plan_helper(
            self.abstract_user_plan.id)

    def test_purchase_plans_402_response(self):
        (response_data, status_code, error_message) = self.post_with_token(self.planHelper.purchaseAbstractUserPlanURL,
                                                                           {'abstract_user_plan_id': self.abstract_user_plan.id})
        self.assertEqual(status_code, 402, error_message)
        self.assertEqual(response_data['message'],
                         'balance is not enough', error_message)

    def test_get_user_plan_successful_response(self):
        (response_data, status_code, error_message) = self.post_with_token(
            self.planHelper.getUserPlanURL)
        self.assertEqual(response_data['message'], 'Successful', error_message)
        self.assertIsNone(response_data['data']['user_plan'], error_message)

        self.planHelper.purchase_abstract_user_plan_helper(
            self.abstract_user_plan.id)

        (response_data, status_code, error_message) = self.post_with_token(
            self.planHelper.getUserPlanURL)

        self.assertEqual(response_data['message'], 'Successful', error_message)
        self.assertIsNotNone(response_data['data']['user_plan'], error_message)
        self.assertEqual(response_data['data']['user_plan']['purchased_price'],
                         self.abstract_user_plan.get_final_price(), error_message)
        self.assertEqual(response_data['data']['user_plan']
                         ['name'], self.abstract_user_plan.name, error_message)
        self.assertEqual(response_data['data']['user_plan']['wage_factor'],
                         self.abstract_user_plan.wage_factor, error_message)
        self.assertEqual(response_data['data']['user_plan']['tax_factor'],
                         self.abstract_user_plan.tax_factor, error_message)
        self.assertEqual(response_data['data']['user_plan']['min_wage_fee'],
                         self.abstract_user_plan.min_wage_fee, error_message)
        self.assertEqual(response_data['data']['user_plan']['max_institutes_per_user'], self.abstract_user_plan.max_institutes_per_user,
                         error_message)
        # TODO also assert start_date and end_date
