# Contributors Listed Below - COPYRIGHT 2016
# [+] International Business Machines Corp.
#
#
# 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.


def dts_encode(obj, fd, **kw):
    ''' A rudimentary python to dts encoder.
    '''
    indent = kw.get('indent', 0)
    depth = kw.setdefault('depth', 0)
    tab = indent * depth * ' '
    kw['depth'] += 1
    newline = '\n' if indent else ' '
    context = kw.get('context')

    if(isinstance(obj, dict)):
        nodes = []
        for k, v in obj.items():
            if(isinstance(v, dict)):
                nodes.append((k, v))
                continue
            if(isinstance(v, str) and v.lower() == 'true'):
                fd.write('%s%s' % (tab, k))
            elif(isinstance(v, str) and v.lower() == 'false'):
                continue
            else:
                fd.write('%s%s = ' % (tab, k))
                dts_encode(v, fd, **kw)
            fd.write(";%s" % newline)

        for k, v in nodes:
            fd.write('%s%s {%s' % (tab, k, newline))
            dts_encode(v, fd, **kw)
            fd.write('%s};%s' % (tab, newline))

    if(isinstance(obj, int)):
        if context == 'int_list':
            fd.write("%d" % obj)
        else:
            fd.write("<%d>" % obj)

    if(isinstance(obj, str)):
        fd.write("\"%s\"" % obj)

    if(isinstance(obj, list)):
        ctx = 'int_list' if all((type(x) is int) for x in iter(obj)) else ''
        if ctx is 'int_list':
            delim = ' '
            closure = ('<', '>')
        else:
            delim = ','
            closure = ('', '')

        fd.write(closure[0])
        if obj:
            for v in obj[:-1]:
                dts_encode(v, fd, context=ctx, **kw)
                fd.write(delim)

            dts_encode(obj[-1], fd, context=ctx)

        fd.write(closure[1])
