#!/usr/bin/python
# -*- coding: utf-8 -*-
#puddletag.py

#Copyright (C) 2008-2009 concentricpuddle

#This file is part of puddletag, a semi-good music tag editor.

#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 of the License, 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 this program; if not, write to the Free Software
#Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

#import psyco
#psyco.full()
import sys, os
_libs = [('mutagen', '(usually python-mutagen or just mutagen)', 
            'http://code.google.com/p/mutagen/'),
         ('configobj', '(usually python-configobj)', 
            'http://code.google.com/p/configobj/'),
         ('pyparsing', '(python-pyparsing or python-parsing in most distros)',
            'http://pyparsing.wikispaces.com/'),
         ('PyQt4', '(python-qt4 usually)', 
            'http://www.riverbankcomputing.co.uk/software/pyqt/intro')]
_recommended = [
    ('musicbrainz2', 'It is recommended for MusicBrainz support. Available as '
        'python-musicbrainz2 in most distros.', 'python-musicbrainz2',
        'http://musicbrainz2.org/doc/PythonMusicBrainz2'),]

def check_libs():
    found = True
    errors = []
    msg = "Error: The %s module wasn't found. Please check that it's installed " \
            "properly. Download it from your distro's repository" \
            " %s or directly from %s \n"
    for lib in _libs:
        try:
            __import__(lib[0])
        except ImportError:
            print msg % lib
            errors.append(msg % lib)
            found = False

    msg = "Error: %s module wasn't found. %s. Please check that it's " \
        "installed properly. You can download it from your distro's " \
        "repository (%s), or download directly from %s.\n"
    
    for lib in _recommended:
        try:
            __import__(lib[0])
        except ImportError:
            errors.append(msg % lib)
            print msg % lib

    try:
        if not found:
            from PyQt4.QtGui import QApplication, QMessageBox
            app = QApplication([])
            QMessageBox.critical(None, 'puddletag', '\n'.join(errors))
    except:
        pass
    
    if not found:
       sys.exit(0)

if __name__ == '__main__':
    check_libs()

from PyQt4.QtGui import QApplication, QFont, QPixmap, QSplashScreen, QIcon
from PyQt4.QtCore import pyqtRemoveInputHook, QTranslator, QLocale
import pdb, logging
pyqtRemoveInputHook()

def create_log():
    join = os.path.join
    rename = os.rename
    exists = os.path.exists
    
    from puddlestuff.constants import SAVEDIR
    if not os.path.exists(SAVEDIR):
        os.mkdir(SAVEDIR)

    for i in reversed(range(1, 5)):
        filename = join(SAVEDIR, 'log%d.log' % i)
        if exists(filename):
            rename(filename, join(SAVEDIR, 'log%d.log' % (i + 1)))

    log_file = join(SAVEDIR, 'log.log')
    if exists(log_file):
        rename(log_file, join(SAVEDIR, 'log1.log'))


    class stdout(object):
        def __init__(self, old_write, new_write):
            self._old_write = old_write
            self._new_write = new_write

        def write(self, text):
            self._old_write(text)
            try:
                self._new_write(text)
            except:
                pass

    f = open(log_file, 'w')
    sys.stdout = stdout(sys.stdout.write, f.write)
    sys.stderr = stdout(sys.stderr.write, f.write)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    qtTranslator = QTranslator()
    import puddlestuff.constants
    TRANSDIR = puddlestuff.constants.TRANSDIR
    from puddlestuff.translations import translate
    from puddlestuff.puddleobjects import get_languages, PuddleConfig
    from puddlestuff import version_string, revision, resource

    if '--langfile' in sys.argv:
        index = sys.argv.index('--langfile')
        langfile = sys.argv[index + 1]
        if not langfile.endswith('.qm'):
            print translate('Defaults', 'Invalid translation file.')
            langargs = None
        else:
            langargs = os.path.basename(langfile), os.path.dirname(langfile)
        del(sys.argv[index])
        del(sys.argv[index])
    else:
        langargs = None

    if not langargs:
        cparser = PuddleConfig()
        lang = cparser.get('main', 'lang', u'auto')
        langs = get_languages([TRANSDIR])
        
        if lang != 'auto':
            if lang in langs:
                f = langs[lang]
                langargs = os.path.basename(f), os.path.dirname(f)

        if not langargs and lang != 'default':
            locale = unicode(QLocale.system().name())
            if locale in langs:
                f = langs[locale]
                langargs = os.path.basename(f), os.path.dirname(f)

    if langargs and langargs != 'default':
        if qtTranslator.load(*langargs):
            app.installTranslator(qtTranslator)
    puddlestuff.constants.trans_strings()
    puddlestuff.puddleobjects.trans_imagetypes()

    if '--debug' in sys.argv:
        create_log()
        sys.argv.remove('--debug')
        logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)

    size = None

    for i, arg in enumerate(sys.argv):
        if arg.startswith('--fontsize'):
            try:
                size = int(sys.argv[i + 1])
            except IndexError:
                print 'No fontsize specified.'
            except ValueError:
                print 'Invalid fontsize specified.'

    if len(sys.argv) > 1:
        filename = sys.argv[-1]
    else:
        filename = None

    
    if revision:
        print translate('Defaults', 'puddletag Version: %1, Revision: %2').arg(
            version_string).arg(unicode(revision))
    else:
        print translate('Defaults', 'puddletag Version: %s' % version_string)

    app.setWindowIcon(QIcon(":/appicon.png"))
    pixmap = QPixmap(':/puddlelogo.png')
    splash = QSplashScreen(pixmap)
    splash.show()
    app.processEvents()

    if size is not None:
        font = app.font()
        font.setPointSize(size)
        app.setFont(font)
    app.setOrganizationName("Puddle Inc.")
    app.setApplicationName("puddletag")
    from puddlestuff.puddletag import MainWin
    win = MainWin()
    splash.close()
    win.setVisible(True)
    app.processEvents()
    if filename and os.path.exists(filename):
        win.openDir(filename)
    app.exec_()