# *
# *  Copyright (C) 2012-2013 Garrett Brown
# *  Copyright (C) 2010      j48antialias
# *
# *  This Program is free software; you can redistribute it and/or modify
# *  it under the terms of the GNU General Public License as published by
# *  the Free Software Foundation; either version 2, or (at your option)
# *  any later version.
# *
# *  This Program is distributed in the hope that it will be useful,
# *  but WITHOUT ANY WARRANTY; without even the implied warranty of
# *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# *  GNU General Public License for more details.
# *
# *  You should have received a copy of the GNU General Public License
# *  along with XBMC; see the file COPYING.  If not, write to
# *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
# *  http://www.gnu.org/copyleft/gpl.html
# *
# *  Based on code by j48antialias:
# *  https://anarchintosh-projects.googlecode.com/files/addons_xml_generator.py

""" addons.xml generator """

import os
import sys

# Compatibility with 3.0, 3.1 and 3.2 not supporting u"" literals
if sys.version < '3':
    print("Python version < 3 detected")
    import codecs
    def u(x):
        return codecs.unicode_escape_decode(x)[0]
else:
    print("Python version => 3 detected")
    def u(x):
        return x

class Generator:
    """
        Generates a new addons.xml file from each addons addon.xml file
        and a new addons.xml.md5 hash file. Must be run from the root of
        the checked-out repo. Only handles single depth folder structure.
    """
    print("Starting up generation...")
    def __init__( self ):
        # generate files
        print("Generating xml file...")
        self._generate_addons_file()
        print("")
        print("---")
        print("Generating md5 file...")
        self._generate_md5_file()
        print("")
        print("---")
        # notify user
        print("Finished updating addons xml and md5 files")

    def _generate_addons_file( self ):
        # addon list
        print("Getting addons list...")
        addons = os.listdir( "." )
        # final addons text
        addons_xml = u("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<addons>\n")
        # loop thru and add each addons addon.xml file
        print("Processing addon list...")
        for addon in addons:
            print("---------------------------------")
            print("Processing addon " + addon + "...")
            try:
                # skip any file or .svn folder or .git folder
                print("Cleaning file...")
                if ( not os.path.isdir( addon ) or addon == ".svn" or addon == ".git" ):
                  print("Skipping unknown file...")
                  continue
                # create path
                print("Creating path...")
                _path = os.path.join( addon, "addon.xml" )
                # split lines for stripping
                print("Processing...")
                xml_lines = open( _path, "r" , encoding="UTF-8").read().splitlines()
                # new addon
                print("Adding addon to xml file...")
                addon_xml = ""
                # loop thru cleaning each line
                for line in xml_lines:
                    # skip encoding format line
                    if ( line.find( "<?xml" ) >= 0 ): continue
                    # add line
                    if sys.version < '3':
                        addon_xml += unicode( line.rstrip() + "\n", "UTF-8" )
                    else:
                        addon_xml += line.rstrip() + "\n"
                # we succeeded so add to our final addons.xml text
                print("Success adding addon to xml file")
                addons_xml += addon_xml.rstrip() + "\n\n"
            except Exception as e:
                # missing or poorly formatted addon.xml
                print("Exception:")
                print("Excluding %s for %s" % ( _path, e ))
        # clean and add closing tag
        print("Final clean up...")
        addons_xml = addons_xml.strip() + u("\n</addons>\n")
        # save file
        self._save_file( addons_xml.encode( "UTF-8" ), file="addons.xml" )

    def _generate_md5_file( self ):
        # create a new md5 hash
        try:
            import md5
            m = md5.new( open( "addons.xml", "r" ).read() ).hexdigest()
        except ImportError:
            import hashlib
            m = hashlib.md5( open( "addons.xml", "r", encoding="UTF-8" ).read().encode( "UTF-8" ) ).hexdigest()

        # save file
        try:
            self._save_file( m.encode( "UTF-8" ), file="addons.xml.md5" )
        except Exception as e:
            # oops
            print("Exception:")
            print("An error occurred creating addons.xml.md5 file!\n%s" % e)

    def _save_file( self, data, file ):
        print("Saving file...")
        try:
            # write data to the file (use b for Python 3)
            open( file, "wb" ).write( data )
        except Exception as e:
            # oops
            print("Exception:")
            print("An error occurred saving %s file!\n%s" % ( file, e ))


if ( __name__ == "__main__" ):
    # start
    Generator()
