# -*- coding: utf-8 -*-
"""
Copyright (c) 2016 Biuro Urządzania Lasu i Geodezji Leśnej

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), 
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
OTHER DEALINGS IN THE SOFTWARE.
"""
from Mapa_PU.model import biblioteka_dll, wynik_kontroli

"""Medody rzeszukiwania rejestru"""

import winreg, os
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from Mapa_PU.kontroler import metody_globalne
from Mapa_PU.kontroler import komunikaty
from qgis.utils import iface
import Mapa_PU
import Mapa_PU.kontroler.metody_globalne

nazwaBiblioteki=u'ReportsHelper.dll'


def szukaj(podkluczNazwa,nazwaWartosci,kluczGlowny=winreg.HKEY_LOCAL_MACHINE):
    """Zwraca wartośc w którym występuje szukany ciag
    :param podkluczNazwa: podklucz od którego zaczyna się szukanie
    :param nazwaWartosci: ciąg szukany w rejestrze
    :param kluczGlowny: klucz HKEY...
    :return wartośc zawierająca szukany ciąg
    """
    try:
       
        key=otworzKlucz(podkluczNazwa,kluczGlowny)
        if key!=None:
           
            wartosc=przejdzWartosci(key,nazwaWartosci)
            if wartosc!=None:
               
                if metody_globalne.czyJestPlik(u'%s' % wartosc)==True:
                    return wartosc
            else:
                podklucze=listaPodkluczy(key)
                for podklucz in podklucze:
                    k=zlozKlucz(podkluczNazwa,podklucz)
                    w=szukaj(k,nazwaWartosci,kluczGlowny)
                    if w!=None:
                       
                        if metody_globalne.czyJestPlik(u'%s' % w)==True:
                            return w
        
        return None
       
    except Exception as e:
        komunikaty.blad_systemowy(e)

def otworzKlucz(podklucz,kluczGlowny=winreg.HKEY_LOCAL_MACHINE):
    """Otwiera klucz do przeszukiwania
    :param kluczGlowny: stala klucza z winreg
    :param podklucz:scieżka do klucza podrzędnego
    :return klucz otwarty
    """
    try:
        return winreg.OpenKey(kluczGlowny,podklucz)
    except Exception as e:
        return None

def znajdzWartoscKlucza(klucz,nazwa=None):
    """Zwraca wartośc klucza lub None
    :param klucz: klucz nadrzeędny
    :param nazwa: nazwa podklucza szukanej wartości
    :return wartosc podklucza lub None
    """
    try:
        wartosc, typ=winreg.QueryValueEx(klucz,nazwa)
        return wartosc
    except WindowsError:
        return None

def listaPodkluczy(klucz):
    """Lista podkluczy w kluczu
    :param klucz:klucz nadrzędny
    :return listapodkluczy
    """
    try:
        lista=[]
        i,n,z= winreg.QueryInfoKey(klucz)
        for k in range(0,i):
            lista.append(winreg.EnumKey(klucz, k))
        return lista
    except Exception as e:
        komunikaty.blad_systemowy(e)

def _znajdzWartosc(napis,wartosc):
    """znajduje warto�c w ci�gu"""
    try:
        if napis.find(wartosc)>-1:
            return napis
        else:
            return None
    except:
        return None
    
def przejdzWartosci(klucz,wartosc):
    """Przechodzi wartosci klucza w poszukiwaniu ciagu
    :param klucz: klucz przeszukiwany
    :param wartosc: poszukiwana wartosc ciagu zawarta dla elementu klucza
    :return wartośc klucza
    """
    try:
        i=0
        while True:
            w=winreg.EnumValue(klucz,i)
            i=i+1
            if _znajdzWartosc(w[1],wartosc)!=None:
                return w[1]
    except WindowsError:
        return None
  

    
def podKlucz(klucz,i):
    """Zwraca podklucz
    :param klucz: klucz rejestru
    :param i:pozycja w kluczu
    :return podklucz
    """
    return winreg.EnumKey(klucz, i)

def zlozKlucz(*a):
    """sklada klucz
    :param *a:lista argumentów
    :return wartosc złożona 
    """
    if a[0]==None:
        return a[1]
    else:
        return '\\'.join(a)

def wartoscKlucza(podkluczDomyslny='SOFTWARE\\TaksatorPU\\x64'):
    """Zwraca warośc klucza
    :param podkluczDomyslny: SOFTWARE\\TaksatorPU\\x64
    """
    try:
        key=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,podkluczDomyslny)
        i=0
        while True:
            try:
                if winreg.EnumValue(key,i)[0]== 'Installed':
                    wartosc=winreg.EnumValue(key,i)[1]
                    key.Close()
                    return wartosc
                i=i+1
            except EnvironmentError:
                key.Close()
                return None
    except Exception:
        return None
    
        
        
def szukaj_taksator():
        """Metoda wyszukuje katalog z biblioteką taksatora PU
        :return katalog taksatora pu
        """
        try:
            #Tego absolutnie nie usówac
            komunikaty.czekanie(u'Wyszukiwanie aplikacji Taksator PU.')
                        
            #wyszukanie w rejestrze katalogu TaksatorPU
            wynik=wartoscKlucza()
            
            #
            katalog=u'%s\\' % os.path.realpath(wynik)
            
            if metody_globalne.czyJestPlik(u'%s\\%s' % (katalog,nazwaBiblioteki))==False:
                #obsługa szukania w pliku konfiguracji
               
                katalog=sprawdz_domyslny_katalog()
                
                if metody_globalne.czyJestPlik(u'%s\\%s' % (katalog,nazwaBiblioteki))==False:
                    #Obsluga recznego wskazywania biblioteki
                    ret=komunikaty.blad_wybierz_anuluj(u"Brak Taksatora PU", u"Program 'Mapa PU' nie znalazł zainstalowanej aplikacji 'Taksator PU' w wersji '%s' lub wyższej.\nProszę wybrać 'Wybierz' w celu wskazania katalogu z zainstalowaną aplikacją 'Taksator PU'." % Mapa_PU.upul_modul.taksator_PU)
                    if ret==1:
                        return None
                    
                    katalog=wybierz_katalog()
                    
                else:
                    
                    if biblioteka_dll.kontroluj_biblioteke(katalog)==False:
                        ret=komunikaty.blad_wybierz_anuluj(u"Błędne biblioteki Taksatora PU", u"Wybrany katalog nie zawiera aplikacji 'Taksator PU' w wersji 64 bitowej .\nProszę wybrać 'Wybierz' w celu wskazania katalogu z zainstalowaną aplikacją 'Taksator PU' w wersji 64 bitowej.")
                        if ret==1:
                            return None
                        
                        katalog=wybierz_katalog()
                        
            return katalog
        except Exception as e:
            komunikaty.blad_systemowy(e)
        finally:
            komunikaty.usun()


def wybierz_katalog():
    """Zwraca katalog
    :return katalog
    """
    try:
        while True:
            katalog=QFileDialog.getExistingDirectory(iface.mainWindow(),u'Wybierz katalog z aplikacją TaksatorPU','C:\\')
            if katalog=='':
                #Anulowanie wyboru
                return None
            if metody_globalne.czyJestPlik(u'%s\\%s' % (katalog,nazwaBiblioteki))==False:
                ret=komunikaty.blad_wybierz_anuluj(u"Brak Taksatora PU", u"Wybrany katalog nie zawiera aplikacji 'Taksator PU' w wersji '%s' lub wyższej.\nProszę wybrać 'Wybierz' w celu wskazania katalogu z zainstalowaną aplikacją 'Taksator PU'." % Mapa_PU.upul_modul.taksator_PU)
                if ret==1:
                    return None
            else:
                if biblioteka_dll.kontroluj_biblioteke(katalog)==False:
                    ret=komunikaty.blad_wybierz_anuluj(u"Błędne biblioteki Taksatora PU", u"Wybrany katalog nie zawiera aplikacji 'Taksator PU' w wersji 64 bitowej .\nProszę wybrać 'Wybierz' w celu wskazania katalogu z zainstalowaną aplikacją 'Taksator PU' w wersji 64 bitowej.")
                    if ret==1:
                        return None
                else:
                    zapisz_domyslny_katalog(katalog)
                    return katalog
    except Exception as e:
        komunikaty.blad_systemowy(e)
 
def sprawdz_domyslny_katalog():
    """Sprawdza wpis w pliku konfiguracyjnym
    :return sciezka katalogu
    """
    try:
        sciezka='%s//konfiguracja//katalog_taksator_pu.txt' % Mapa_PU.upul_modul.root
        plik=metody_globalne.otworzPlik(sciezka, "r")
        katalog=plik.read()
        plik.close()
        return katalog
    except Exception as e:
        komunikaty.blad_systemowy(e)

        
def zapisz_domyslny_katalog(katalog):
    """zapisuje domyślny katalog taksatora PU
    :param katalog:sciezka do katalogu
    """
    try:
        sciezka='%s//konfiguracja//katalog_taksator_pu.txt' % Mapa_PU.upul_modul.root
        metody_globalne.zapiszText(sciezka,katalog)
    except Exception as e:
        komunikaty.blad_systemowy(e)
        

        