from __future__ import annotations
from typing import TYPE_CHECKING

from pydantic import BaseModel
from typing import List, TypeVar, Type

from helpers import irt_helper

from models.item import Item
from models.targets.tif_target import TifTarget
from models.targets.tcc_target import TccTarget

from lib.irt.test_response_function import TestResponseFunction

if TYPE_CHECKING:
    from models.solver_run import SolverRun

_T = TypeVar("_T")

class Form(BaseModel):
    items: List[Item]
    cut_score: float
    tif_results: List[TifTarget]
    tcc_results: List[TccTarget]
    status: str = 'Not Optimized'
    solver_variables: List[str]

    @classmethod
    def create(cls: Type[_T], items: list, solver_run: SolverRun, status: str, solver_variables: list) -> _T:
        return cls(
            items=items,
            cut_score=TestResponseFunction(solver_run.irt_model).calculate(
                items, theta=solver_run.theta_cut_score),
            tif_results=irt_helper.generate_tif_results(items, solver_run),
            tcc_results=irt_helper.generate_tcc_results(items, solver_run),
            status=status,
            solver_variables=solver_variables)

    def has_item(self, item: Item) -> bool:
        for i in self.items:
            if item == i:
                return True

        return False