import matplotlib 
from string import Formatter

class StrMethodTickFormatterConvertor(object):

    STRING_FORMAT_D3 = "d3-format"

    SUPPORTED_OUTPUT_FORMATS = (
        STRING_FORMAT_D3, 
    )

    def __init__(self, formatter, output_format=STRING_FORMAT_D3): 
        assert output_format in self.SUPPORTED_OUTPUT_FORMATS, "Unknown output_format" 
        if not isinstance(formatter, matplotlib.ticker.StrMethodFormatter):
            raise ValueError("Formatter must be of type `matplotlib.ticker.StrMethodFormatter`")
        self.formatter = formatter 
        self.output_format = output_format

    @property
    def is_output_d3(self):
        return self.output_format == self.STRING_FORMAT_D3 

    def export_mpl_format_str_d3(self, mpl_format_str):
        prefixes = []
        suffixes = []
        before_x = True
        format_spec_for_d3 = "" 
        for literal_text, field_name, format_spec, conversion in Formatter().parse(mpl_format_str): 
            if before_x:
                prefixes.append(literal_text)
            else:
                suffixes.append(literal_text)

            if field_name == "x" and format_spec and format_spec_for_d3 and self.is_output_d3:
                raise ValueError("D3 doesn't support multiple conversions")
                
            if field_name == "x":
                before_x = False
                format_spec_for_d3 = format_spec  

        prefix = "".join(prefixes)
        suffix = "".join(suffixes)
        return {
            "format_string": format_spec_for_d3,
            "prefix": prefix,
            "suffix": suffix
        }

    @property
    def output(self):
        # just incase we want to support something other than d3
        if self.is_output_d3:
            return self.export_mpl_format_str_d3(self.formatter.fmt)