#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from typing import Self, Any, Optional
from Interfaces.FormatModuleInterface import FormatModuleInterface
from Utils.Patterns import RE
from Utils.Check import Check
from Utils.Utils import Utils

class MixFormat:

    def __init__(self:Self, 
        format:FormatModuleInterface, 
        options:Optional[dict[str, Any|None]] = None
    ) -> None:
        self.format:FormatModuleInterface = format
        self.capitalize:bool = bool(options and options.get("capitalized"))

    def __get_separator_and_items(self:Self, i:int, inputs:str|list[Any|None]) -> tuple[str, list[str]]:

        separator:str
        original_items:list[str]

        separator, original_items = (
            (lambda _, separator, options:(
                separator, str(options).split("|")
            ))(*RE.BASIC_MODE_SPLIT.match(inputs).groups()) if Check.is_string(inputs) else 
            inputs if Check.is_array(inputs) else 
        (None, None))

        return separator, self.format.get_list(i, original_items)

    def get(self:Self, 
        i:int, 
        inputs:str|list[Any|None], 
        shared:dict[str, Any|None] = {}, 
        fragments:list[str] = []
    ) -> str:
        
        separator:str
        items:list[str]
        l:int
        results:str

        separator, items = self.__get_separator_and_items(i, inputs)
        l = len(items)

        Utils.randomize_array(items)
        results = self.format.execute(i, (
            "".join(items) if l < 2 else 
        ", ".join(items[:l - 1]) + (
            " " if not separator else 
            " " + separator.strip() + " " if RE.IS_SEPARATOR.match(separator) else 
        separator) + items[l - 1]), shared, fragments)

        return RE.CAPITAL_CASE.sub(lambda matches:(
            matches.group(1).upper()
        ), results) if self.capitalize else results
    
    def check(self:Self, 
        i:int, 
        string:str, 
        inputs:str|list[Any|None], 
        shared:dict[str, Any|None] = {}, 
        fragments:list[str] = []
    ) -> int:
        
        separator:str
        items:list[str]
        l:int

        separator, items = self.__get_separator_and_items(i, inputs)
        l = len(items)

        return self.format.check_select(i, string, ((l, l), separator, items), shared, fragments)
        
