from __future__ import annotations
from typing import TYPE_CHECKING

from models.constraints.generic_constraint import *

if TYPE_CHECKING:
    from models.solver_run import SolverRun

class FormUniquenessConstraint(GenericConstraint):
    @classmethod
    def create(cls: Type[_T], total_items: int) -> _T:
        return cls(
            minimum=0,
            maximum=0,
            reference_attribute=Attribute(
                value=total_items,
                type='form_uniqueness',
                id='form_uniqueness'
            )
        )

    def build(self, problem_handler: Problem, **kwargs) -> None:
        logging.info('Form Uniqueness Constraint Generating...')

        # form uniqueness constraint
        problem_handler.problem += lpSum(
            [
                kwargs['solution'].items_exist_in_forms(bundle.items) * problem_handler.solver_bundles_var[bundle.id]
                for bundle in problem_handler.bundles
            ] + [
                kwargs['solution'].items_exist_in_forms([item]) * problem_handler.solver_items_var[item.id]
                for item in problem_handler.items
            ]
        ) <= self.reference_attribute.value, f'Ensuring uniqueness for form'