#!/usr/bin/env python

import sys
import os
import site
from lbrynet import __version__

LINUX = 1
DARWIN = 2
WINDOWS = 3

if sys.platform.startswith("linux"):
    platform = LINUX
elif sys.platform.startswith("darwin"):
    platform = DARWIN
elif sys.platform.startswith("win"):
    platform = WINDOWS
else:
    raise Exception("Unknown os: %s" % sys.platform)

base_dir = os.path.abspath(os.path.dirname(__file__))
package_name = "lbrynet"
dist_name = "LBRY"
description = "A decentralized media library and marketplace"
author = "LBRY, Inc"
url = "lbry.io"
maintainer = "Jack Robison"
maintainer_email = "jack@lbry.io"
keywords = "LBRY"


# TODO: find a way to keep this in sync with requirements.txt
requires = [
    'Twisted==16.0.0',
    'Yapsy==1.11.223',
    'appdirs==1.4.0',
    'argparse==1.2.1',
    'colorama==0.3.7',
    'dnspython==1.12.0',
    'ecdsa==0.13',
    'envparse==0.2.0',
    'gmpy==1.17',
    'jsonrpc==1.2',
    'jsonrpclib==0.1.7',
    'jsonschema==2.5.1',
    'lbryum>=2.7.4',
    'loggly-python-handler==1.0.0',
    'miniupnpc==1.9',
    'pbkdf2==1.3',
    'protobuf==3.0.0',
    'pycrypto==2.6.1',
    'qrcode==5.2.2',
    'requests==2.9.1',
    'requests_futures==0.9.7',
    'seccure==0.3.1.3',
    'simplejson==3.8.2',
    'six>=1.9.0',
    'slowaes==0.1a1',
    'txJSON-RPC==0.5',
    'wsgiref==0.1.2',
    'zope.interface==4.1.3',
    'base58==0.2.2',
    'googlefinance==0.7',
    'pyyaml==3.12',
    'service_identity==16.0.0',
    'ndg-httpsclient==0.4.2',
]


console_scripts = [
    'lbrynet-daemon = lbrynet.lbrynet_daemon.DaemonControl:start',
    'stop-lbrynet-daemon = lbrynet.lbrynet_daemon.DaemonControl:stop',
    'lbrynet-cli = lbrynet.lbrynet_daemon.DaemonCLI:main'
]


def package_files(directory):
    for path, _, filenames in os.walk(directory):
        for filename in filenames:
            yield os.path.join('..', path, filename)


if platform == LINUX:
    import ez_setup
    ez_setup.use_setuptools()
    from setuptools import setup, find_packages

    requires.append('service-identity')

    setup(name=package_name,
          description=description,
          version=__version__,
          maintainer=maintainer,
          maintainer_email=maintainer_email,
          url=url,
          author=author,
          keywords=keywords,
          packages=find_packages(base_dir),
          install_requires=requires,
          entry_points={'console_scripts': console_scripts},
          package_data={
              package_name: list(package_files('lbrynet/resources/ui'))
          }
    )

elif platform == DARWIN:
    import ez_setup

    ez_setup.use_setuptools()
    from setuptools import setup, find_packages

    setup(name=package_name,
          description=description,
          version=__version__,
          maintainer=maintainer,
          maintainer_email=maintainer_email,
          url=url,
          author=author,
          keywords=keywords,
          packages=find_packages(base_dir),
          install_requires=requires,
          entry_points={'console_scripts': console_scripts},
          package_data={
              package_name: list(package_files('lbrynet/resources/ui'))
          },
          # If this is True, setuptools tries to build an egg
          # and py2app / modulegraph / imp.find_module
          # doesn't like that.
          zip_safe=False,
    )

elif platform == WINDOWS:
    import opcode
    import pkg_resources
    from cx_Freeze import setup, Executable
    import requests.certs

    app_dir = os.path.join('packaging', 'windows', 'lbry-win32-app')
    daemon_dir = os.path.join('lbrynet', 'lbrynet_daemon')
    win_icon = os.path.join(app_dir, 'icons', 'lbry256.ico')
    wordlist_path = pkg_resources.resource_filename('lbryum', 'wordlist')

    # Allow virtualenv to find distutils of base python installation
    distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')

    schemas = os.path.join(site.getsitepackages()[1], "jsonschema", "schemas")
    onlyfiles = [f for f in os.listdir(schemas) if os.path.isfile(os.path.join(schemas, f))]
    zipincludes = [(os.path.join(schemas, f), os.path.join("jsonschema", "schemas", f)) for f in onlyfiles]

    def find_data_file(filename):
        if getattr(sys, 'frozen', False):
            # The application is frozen
            data_dir = os.path.dirname(sys.executable)
        else:
            # The application is not frozen
            # Change this bit to match where you store your data files:
            data_dir = os.path.dirname(__file__)
        return os.path.join(data_dir, filename)

    shortcut_table = [
        ('LBRYShortcut',  # Shortcut
         'DesktopFolder',  # Directory
         'LBRY',  # Name
         'TARGETDIR',  # Component
         '[TARGETDIR]\{0}.exe'.format(dist_name),  # Target
         None,  # Arguments
         description,  # Description
         None,  # Hotkey
         None,  # Icon
         None,  # IconIndex
         None,  # ShowCmd
         'TARGETDIR',  # WkDir
         ),
        # ('DaemonShortcut',  # Shortcut
        #  'DesktopFolder',  # Directory
        #  'lbrynet-daemon',  # Name
        #  'TARGETDIR',  # Component
        #  '[TARGETDIR]\lbrynet-daemon.exe',  # Target
        #  '--log-to-console',  # Arguments
        #  description,  # Description
        #  None,  # Hotkey
        #  None,  # Icon
        #  None,  # IconIndex
        #  None,  # ShowCmd
        #  'TARGETDIR',  # WkDir
        #  ),
        # ('DaemonCLIShortcut',  # Shortcut
        #  'DesktopFolder',  # Directory
        #  'lbrynet-cli',  # Name
        #  'TARGETDIR',  # Component
        #  '[TARGETDIR]\lbrynet-cli.exe',  # Target
        #  None,  # Arguments
        #  description,  # Description
        #  None,  # Hotkey
        #  None,  # Icon
        #  None,  # IconIndex
        #  None,  # ShowCmd
        #  'TARGETDIR',  # WkDir
        #  ),
        ('ProgramMenuLBRYShortcut',  # Shortcut
         'ProgramMenuFolder',  # Directory
         # r'[ProgramMenuFolder]\lbrynet',  # Directory
         'LBRY',  # Name
         'TARGETDIR',  # Component
         '[TARGETDIR]\{0}.exe'.format(dist_name),  # Target
         None,  # Arguments
         description,  # Description
         None,  # Hotkey
         None,  # Icon
         None,  # IconIndex
         None,  # ShowCmd
         'TARGETDIR',  # WkDir
         ),
        ('ProgramMenuDaemonShortcut',  # Shortcut
         'ProgramMenuFolder',  # Directory
         # r'[ProgramMenuFolder]\lbrynet',  # Directory
         'lbrynet-daemon',  # Name
         'TARGETDIR',  # Component
         '[TARGETDIR]\lbrynet-daemon.exe',  # Target
         '--log-to-console',  # Arguments
         description,  # Description
         None,  # Hotkey
         None,  # Icon
         None,  # IconIndex
         None,  # ShowCmd
         'TARGETDIR',  # WkDir
         ),
        ('ProgramMenuDaemonCLIShortcut',  # Shortcut
         'ProgramMenuFolder',  # Directory
         # r'[ProgramMenuFolder]\lbrynet',  # Directory
         'lbrynet-cli',  # Name
         'TARGETDIR',  # Component
         '[TARGETDIR]\lbrynet-cli.exe',  # Target
         None,  # Arguments
         description,  # Description
         None,  # Hotkey
         None,  # Icon
         None,  # IconIndex
         None,  # ShowCmd
         'TARGETDIR',  # WkDir
         ),
        ]

    msi_data = {"Shortcut": shortcut_table}

    bdist_msi_options = {
        'upgrade_code': '{18c0e933-ad08-44e8-a413-1d0ed624c100}',
        'add_to_path': True,
        # Default install path is 'C:\Program Files\' for 32-bit or 'C:\Program Files (x86)\' for 64-bit
        # 'initial_target_dir': r'[LocalAppDataFolder]\{0}'.format(name),
        'data': msi_data
        }

    build_exe_options = {
        'include_msvcr': True,
        'includes': [],
        'packages': ['cython',
                     'twisted',
                     'yapsy',
                     'appdirs',
                     'argparse',
                     'base58',
                     'colorama',
                     'cx_Freeze',
                     'dns',
                     'ecdsa',
                     'envparse',
                     'gmpy',
                     'googlefinance',
                     'jsonrpc',
                     'jsonrpclib',
                     'lbryum',
                     'loggly',
                     'miniupnpc',
                     'pbkdf2',
                     'google.protobuf',
                     'Crypto',
                     'bitcoinrpc',
                     'win32api',
                     'qrcode',
                     'requests',
                     'requests_futures',
                     'seccure',
                     'simplejson',
                     'jsonschema',
                     'six',
                     'aes',
                     'txjsonrpc',
                     'wsgiref',
                     'zope.interface',
                     'os',
                     'pkg_resources',
                     'yaml'
                     ],
        'excludes': ['distutils', 'collections.sys', 'collections._weakref', 'collections.abc',
                     'Tkinter', 'tk', 'tcl', 'PyQt4', 'nose', 'mock'
                     'zope.interface._zope_interface_coptimizations', 'leveldb'],
        'include_files': [(distutils_path, 'distutils'), (requests.certs.where(), 'cacert.pem'),
                          (os.path.join(app_dir, 'icons', 'lbry16.ico'), os.path.join('icons', 'lbry16.ico')),
                          (os.path.join(app_dir, 'icons', 'lbry256.ico'), os.path.join('icons', 'lbry256.ico')),
                          (os.path.join(wordlist_path, 'chinese_simplified.txt'),
                           os.path.join('wordlist', 'chinese_simplified.txt')),
                          (os.path.join(wordlist_path, 'english.txt'), os.path.join('wordlist', 'english.txt')),
                          (os.path.join(wordlist_path, 'japanese.txt'), os.path.join('wordlist', 'japanese.txt')),
                          (os.path.join(wordlist_path, 'portuguese.txt'), os.path.join('wordlist', 'portuguese.txt')),
                          (os.path.join(wordlist_path, 'spanish.txt'), os.path.join('wordlist', 'spanish.txt'))
                          ],
        'namespace_packages': ['zope', 'google'],
        "zip_includes": zipincludes}

    tray_app = Executable(
        script=os.path.join(app_dir, 'LBRYWin32App.py'),
        base='Win32GUI',
        icon=win_icon,
        targetName='{0}.exe'.format(dist_name)
    )

    daemon_exe = Executable(
        script=os.path.join(daemon_dir, 'DaemonControl.py'),
        icon=win_icon,
        targetName='lbrynet-daemon.exe'
    )

    cli_exe = Executable(
        script=os.path.join(daemon_dir, 'DaemonCLI.py'),
        icon=win_icon,
        targetName='lbrynet-cli.exe'
    )

    setup(
        name=package_name,
        description=description,
        version=__version__,
        maintainer=maintainer,
        maintainer_email=maintainer_email,
        url=url,
        author=author,
        keywords=keywords,
        data_files=[],
        options={
            'build_exe': build_exe_options,
            'bdist_msi': bdist_msi_options
        },
        executables=[
            tray_app,
            daemon_exe,
            cli_exe
        ],
        package_data={
            package_name: list(package_files('lbrynet/resources/ui'))
        }
    )