#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

class Formatter:
    def __init__(self, fields_tuple=(), row_tuple=(), min_width_tuple=None):
        # Format to pass as first argument to the print function, e.g. '%s%s%s'
        self.format = ""
        # data_format will be of the form ['{!s:43}'],'{!s:39}','{!s:11}','{!s:25}']
        # the widths are determined from the data in order to print output with nice format
        # Each entry of the data_format list will be used by the advanced string formatter:
        # "{!s:43}".format("Text")
        # Advanced string formatter as detailed in here: https://www.python.org/dev/peps/pep-3101/
        self.data_format = []
        Formatter._assert(fields_tuple, row_tuple, min_width_tuple)
        self._build_format_tuples(fields_tuple, row_tuple, min_width_tuple)

    @staticmethod
    def _assert(o1, o2, o3):
        if len(o1) != len(o2) and (o3 is not None and len(o2) != len(o3)):
            raise RuntimeError("Object collections must have the same length. "
                               "len(o1)={0}, len(o2)={1}, len(o3)={2}"
                               .format(len(o1), len(o2), -1 if o3 is None else len(o3)))

    # determines the widths from the data in order to print output with nice format
    @staticmethod
    def _find_sizes(fields_tuple, row_tuple, min_width_tuple):
        sizes = []
        padding = 3
        for i in range(0, len(row_tuple)):
            max_len = max(len(fields_tuple[i]), len(str(row_tuple[i])))
            if min_width_tuple is not None:
                max_len = max(max_len, min_width_tuple[i])
            sizes += [max_len + padding]
        return sizes

    def _build_format_tuples(self, fields_tuple, row_tuple, min_width_tuple):
        sizes = Formatter._find_sizes(fields_tuple, row_tuple, min_width_tuple)

        for i in range(0, len(row_tuple)):
            self.format += "%s"
            self.data_format += ["{!s:" + str(sizes[i]) + "}"]

    # Returns a tuple where each entry has a string that is the result of
    # statements with the pattern "{!s:43}".format("Text")
    def row_str_format(self, row_tuple):
        format_with_values = [self.data_format[0].format(row_tuple[0])]
        for i in range(1, len(row_tuple)):
            format_with_values += [self.data_format[i].format(row_tuple[i])]
        return tuple(format_with_values)
