import logging

from lib.irt.models.three_parameter_logistic import ThreeParameterLogistic
from lib.irt.models.rasch import Rasch
from lib.errors.item_generation_error import ItemGenerationError


class ItemInformationFunction():

    def __init__(self, irt_model):
        self.model_data = irt_model

    # determines the amount of information for a given question at a given theta (ability level)
    # further detailed on page 161, equation 4 here:
    #  https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5978482/pdf/10.1177_0146621615613308.pdf
    def calculate(self, **kwargs):
        try:
            if self.model_data.model == '3PL':
                p = ThreeParameterLogistic(self.model_data, kwargs).result()
                q = 1 - p
                return (self.model_data.a_param * q *
                        (p - self.model_data.c_param)**2) / (p * (
                            (1 - self.model_data.c_param)**2))
            elif self.model_data.model == 'rasch':
                p = Rasch(self.model_data, kwargs).result()
                q = 1 - p
                return p * q
            else:
                # potentially error out
                raise ItemGenerationError(
                    "irt model not supported or provided")
        except ZeroDivisionError as error:
            logging.error(error)
            raise ItemGenerationError("params not well formatted",
                                      error.args[0])