# -*- coding: utf-8 -*-
from transformers import PreTrainedModel
from configuration_autonexus import AutoNexusConfig
import torch

try:
    from agentworld_ultra import AutoNexusCognitiveEngine
except ImportError:
    AutoNexusCognitiveEngine = None

class AutoNexusModel(PreTrainedModel):
    config_class = AutoNexusConfig

    def __init__(self, config):
        super().__init__(config)
        self.config = config
        
        # We wrap the Cognitive Engine inside the standard HF PreTrainedModel
        if AutoNexusCognitiveEngine is not None:
            self.engine = AutoNexusCognitiveEngine()
        else:
            self.engine = None
            
        # Dummy parameter to satisfy PyTorch module requirements
        self.dummy_param = torch.nn.Parameter(torch.empty(0))

    def forward(self, input_ids=None, inputs_embeds=None, objective=None, **kwargs):
        """
        Standard forward pass. 
        Accepts a string 'objective' and executes the Tier-0 cognitive loop.
        """
        if objective is None:
            raise ValueError("AutoNexus requires an 'objective' string to execute its cognitive loop.")
            
        if self.engine is None:
            raise RuntimeError("AutoNexusCognitiveEngine backend missing.")
            
        response = self.engine.autonomous_loop(objective, max_iterations=self.config.max_iterations)
        
        # Return as a dictionary mimicking standard HF outputs
        return {"output_text": response}

    def generate(self, objective: str, **kwargs):
        """
        Override standard generate to trigger the autonomous hyper-reflexive engine.
        """
        return self.forward(objective=objective)

# Register the model with Hugging Face auto classes if needed
# AutoConfig.register("autonexus", AutoNexusConfig)
# AutoModel.register(AutoNexusConfig, AutoNexusModel)
