#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import argparse
import glob
import os
import platform
import shutil
import sys

CURRENT_USER = os.getlogin()
HOME_DIR = os.path.expanduser('~{}'.format(CURRENT_USER))
CURRENT_DIR = os.getcwd()
#EEPM_PATH = 'eepm'
WINE_PATH = 'wine'
WINE_PREFIX = os.path.join(HOME_DIR, '.wine')
GUARDANT_LIB_PATH = os.path.join('guardant', 'grdwine', 'x86')
GUARDANT_RUL_PATH = os.path.join('guardant', 'udev-rules')
GUARDANT_FIX_PATH = os.path.join('guardant')
DESKTOP = os.path.join(os.path.join(os.path.expanduser('~')), 'Dasktop')
UTILS_PATH = 'utils'
SW_PATH = 'SmetaWIZARD'
INF = 'inf'

# Проверяем систему, обрабатываем аргументы
if sys.version_info < (3, 5):
    print('Для работы необходим Python v3.5 и выше.')
    sys.exit(1)

ap = argparse.ArgumentParser()
ap.add_argument(
    '-v', '--version',
    action='store_true',
    required=False,
    default=False,
    help='Версия утилиты.'
)
args = ap.parse_args()

if args.version:
    print('Guadant install v0.1')
    sys.exit(0)

dist_name, _, _ = platform.dist()
if 'astralinux' not in dist_name.lower():
    print('Система определяется не как AstraLinux.')
    sys.exit(1)

# if bool(shutil.which('wine')):
#     print('Уже установлен Wine.')
#     sys.exit(1)

if os.geteuid() != 0:
    print('Для работы необходим привелегии root.')
    sys.exit(1)

# Обновляем базу пакетов
# print('Обновляем базу пакетов...')
# os.system('apt-get update &> /dev/null')

# Зависимости для установки модулей ядра wine
# print('Устанавливаем зависимости ... ')
# kernel_version = platform.release()
# os.system('apt-get -y install linux-headers-{} gcc &> /dev/null'.format(kernel_version))

# Устанавливаем wine
#print('Устанавливаем eepm ...')

#os.chdir(EEPM_PATH)
#os.system('dpkg -i *.deb &> /dev/null')
#os.system('apt-get -yf install &> /dev/null')
#os.chdir(CURRENT_DIR)

#if not shutil.which('eepm'):
    #print('Error. Установка не удалась.')
    #sys.exit(1)

print('Устанавливаем Wine, собираем модули ядра ...')

os.chdir(WINE_PATH)
os.system('dpkg -i *.deb')
os.chdir(CURRENT_DIR)

if not shutil.which('wine'):
    print('Error. Установка не удалась.')
    sys.exit(1)

# Устанавливаем guardant
# ищем библиотеку Wine,
# берем первый путь с подходящей архитектурой
print('Ищем путь библиотек Wine... ')

lib_folders = ['/usr/lib32', '/usr/lib64', '/usr/lib', '/usr/libx32',
               '/lib32', '/lib64', '/lib', '/libx32',
               '/var/lib/', '/usr/local/lib']
system_arch = platform.architecture()
wine_libs_path = ''
lib_name = 'kernel32.dll.so'
files = []
for folder in lib_folders:
    if os.path.isdir(folder):
        files = glob.glob(folder + '/**/' + lib_name, recursive=True)
        for lib in files:
            if platform.architecture(lib) == system_arch:
                wine_libs_path = os.path.dirname(lib)
                break

if not wine_libs_path:
    print('Error. Не удалось найти библиотеку {}.'.format(lib_name))
    sys.exit(1)

print('Установливаем Guardant...')
# Копируем библиотеку
src_lib = 'grdwine.dll.so'
full_src_lib = os.path.join(GUARDANT_LIB_PATH, src_lib)
try:
    shutil.copy(full_src_lib, wine_libs_path)
except FileNotFoundError:
    print('Error. Не удалось скопировать {}.'.format(src_lib))
    sys.exit(1)

# Устанавливаем правила ключа
src_rules = '95-grdnt.rules'
full_src_rules = os.path.join(GUARDANT_RUL_PATH, src_rules)
try:
    shutil.copy(full_src_rules, '/etc/udev/rules.d')
except FileNotFoundError:
    print('Error. Не удалось скопировать {}.'.format(src_rules))
    sys.exit(1)

os.system('udevadm control --reload-rules')
os.system('udevadm trigger --subsystem-match=usb --action=add')

# Устанавливаем патч guardant
os.chdir(GUARDANT_FIX_PATH)
os.system('dpkg -i *.deb &> /dev/null')
os.chdir(CURRENT_DIR)

# Настраиваем wine
print('Настраиваем Wine...')
os.system('sudo -u {} WINEPREFIX="{}" wine &> /dev/null'.format(CURRENT_USER, WINE_PREFIX))
os.system('wineboot -u &> /dev/null')

# Лицензия
print('Копируем лицензию...')
shutil.copy('wine-etersoft.lic', '/etc/wine')

# Утилиты
print('Устанавливаем утилиты...')

os.chdir(UTILS_PATH)
os.system('sudo -u {} WINEPREFIX="{}" wine vcredist_x86.exe /q &> /dev/null'.format(CURRENT_USER, WINE_PREFIX))

# Копируем содержимое каталога vcrun2008
src_files = os.listdir('vcrun2008')
for file_name in src_files:
    full_file_name = os.path.join('vcrun2008', file_name)
    if (os.path.isfile(full_file_name)):
        shutil.copy(full_file_name, os.path.join(WINE_PREFIX, 'drive_c', 'windows', 'system32'))
  
# Добавляем регистрацию vcrun2008 в реестр Windows
os.system('sudo -u {} WINEPREFIX="{}" wine start override-dll.reg &> /dev/null'.format(CURRENT_USER, WINE_PREFIX))
os.chdir(CURRENT_DIR)

# SmetaWizard
print('Копируем SmetaWizard...')
shutil.copytree(SW_PATH, os.path.join(WINE_PREFIX, 'drive_c', 'Program Files', SW_PATH))

# Создаем ярлык на рабочий стол
print('Создаем ярлык...')
shutil.copy('SW.desktop', os.path.join(os.path.join(os.path.expanduser('~{}'.format(CURRENT_USER))), 'Desktop'))

# Права
print('Корректируем права...')
os.system('chown -R {} {}'.format(CURRENT_USER, WINE_PREFIX))

# Финиш
print('Установка завершена.')
