import re
import random
import time
import logging

class WriteTextAdvanced:
    @classmethod
    def INPUT_TYPES(s):
        return {
            "required": {
                "text": ("STRING", {"multiline": True, "lines": 10}),
            },
            "optional": {
                "variables": ("STRING", {"multiline": True, "forceInput": True}),
                "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
            },
        }

    RETURN_TYPES = ("STRING",)
    RETURN_NAMES = ("text",)
    FUNCTION = "write_text_special"
    OUTPUT_NODE = True
    CATEGORY = "Bjornulf"
    
    def write_text_special(self, text, variables="", seed=None):
        logging.info(f"Raw text: {text}")
        logging.info(f"Variables: {variables}")

        if len(text) > 10000:
            return ("Text too large to process at once. Please split into smaller parts.",)
        
        if seed is None or seed == 0:
            seed = int(time.time() * 1000)
        
        random.seed(seed)
        
        # Parse variables
        var_dict = {}
        for line in variables.split('\n'):
            if '=' in line:
                key, value = line.split('=', 1)
                var_dict[key.strip()] = value.strip()
        
        logging.info(f"Parsed variables: {var_dict}")

        # Replace variables
        for key, value in var_dict.items():
            text = text.replace(f"<{key}>", value)

        # Handle random choices
        pattern = r'\{([^}]+)\}'
        
        def replace_random(match):
            return random.choice(match.group(1).split('|'))

        result = re.sub(pattern, replace_random, text)
        logging.info(f"Final text: {result}")
        
        return (result,)

    @classmethod
    def IS_CHANGED(s, text, variables="", seed=None):
        return (text, variables, seed)