import style


class _StyledString(str):

    def __new__(cls, style_list, sep, *objects):
        return super(_StyledString, cls).__new__(cls, sep.join([str(obj) for obj in objects]))

    def __init__(self, style_list, sep, *objects):
        self._style_start = ';'.join([str(s[0]) for s in style_list])
        self._style_end = ';'.join([str(s[1]) for s in style_list])
        self._sep = sep
        self._objects = objects

    def __add__(self, other):
        return self.__str__() + str(other)

    def __str__(self):
        if style._StyledStringBuilder._enabled:
            string = ''
            for i, obj in enumerate(self._objects):
                if i > 0:
                    string += self._sep

                if type(obj) is _StyledString:
                    string += '%s\033[%sm' % (obj, self._style_start)
                else:
                    string += str(obj)
            return '\033[%sm%s\033[%sm' % (self._style_start, string, self._style_end)
        return super(_StyledString, self).__str__()

    def rjust(self, width, fillchar=' '):
        n_chars = width - len(self)
        if n_chars > 0:
            string = str(self)
            return string.rjust(len(string) + n_chars, fillchar)
        return self

    def ljust(self, width, fillchar=' '):
        n_chars = width - len(self)
        if n_chars > 0:
            string = str(self)
            return string.ljust(len(string) + n_chars, fillchar)
        return self
