# _*_ coding: utf-8 _*_

from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QMessageBox
import sys
import os
import shutil
import openpyxl


"""
    Вспомогательные функции
"""
def is_number(num):
    try:
        float(num)
        return True
    except ValueError:
        return False

def Score(strElements):
    score = 0
    for element in strElements:
        if element == 1 or element == 2:
            score += element
        else:
            continue
    return score

def Rang(strElements):
    colZero = 0
    colOne = 0
    colTwo = 0

    for element in strElements[0:len(strElements) - 1]:
        if element == 0:
            colZero += 1
        if element == 1:
            colOne += 1
        if element == 2:
            colTwo += 1

    if colZero > colOne and colZero > colTwo:
        return 0

    if colOne > colZero and colOne > colTwo:
        return 1

    if colTwo > colOne and colTwo > colZero:
        return 2

    if (colZero == colOne or colZero == colTwo or colTwo == colOne and colOne != 0 and colZero != 0 and colTwo != 0):
        return 1

"""
    Главный поток программы
"""
class MainWindows(QtGui.QMainWindow):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent=None)
        x_resize = 800
        y_resize = 500
        desktop = QtGui.QApplication.desktop()
        x = (desktop.width() - x_resize ) / 2
        y = (desktop.height() - y_resize) / 2

        self.setGeometry(x, y, x_resize, y_resize)
        self.setWindowTitle(u"Экспертные оценки")

        self.arExName = []
        self.tempFileName = ''


        exit = QtGui.QAction(QtGui.QIcon('icon/exit.png'), u'Выход', self)
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip(u"Закрыть приложение")
        open = QtGui.QAction(QtGui.QIcon('icon/folder_open.png'), u'Открыть', self)
        open.setShortcut('Ctrl+O')
        open.setStatusTip(u"Выбрать папку")
        start1 = QtGui.QAction(QtGui.QIcon('icon/Ruun1.png'), u'Выполнить 1-ю итерацию', self)
        start1.setStatusTip(u"Запустить первую часть анализа экспертных оценок")
        start2 = QtGui.QAction(QtGui.QIcon('icon/Ruun2.png'), u'Выполнить 2-ю итерацию', self)
        start2.setStatusTip(u"Запустить вторую часть анализа экспертных оценок")

        fileTemp = QtGui.QAction(QtGui.QIcon('icon/ruuuun.png'), u'Шаблон', self)


        self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))
        self.connect(open, QtCore.SIGNAL('triggered()'), self.SelectFolder)
        self.connect(start1, QtCore.SIGNAL("triggered()"),self.Event1)
        self.connect(start2, QtCore.SIGNAL("triggered()"), self.Event2)
        self.connect(fileTemp, QtCore.SIGNAL("triggered()"), self.SelectFile)

        self.toolbar = self.addToolBar('Open')
        self.toolbar.addAction(open)
        self.toolbar.addAction(fileTemp)
        #self.toolbar.addAction(exit)
        self.toolbar = self.addToolBar('Run')
        self.toolbar.addAction(start1)
        self.toolbar.addAction(start2)


        self.statusBar()

        self.textEdit = QtGui.QTextEdit(u"Выберите папку где расположены файлы Excel")
        self.textEdit.setReadOnly(1)
        self.setCentralWidget(self.textEdit)



        menubar = self.menuBar()
        file = menubar.addMenu(u"&Файл")
        run = menubar.addMenu(u'&Запустить')
        about = menubar.addMenu(u'&О программе')
        file.addAction(open)
        file.addAction(exit)
        run.addAction(start1)
        run.addAction(start2)

    def addText(self, text, lvl):
        message = "_"*lvl*5 + text
        self.textEdit.append(message)

    def SelectFile(self):
        self.tempFileName = QtGui.QFileDialog.getOpenFileName(self, 'Open File', 'temp')


    def SelectFolder(self):
        directoryName = QtGui.QFileDialog.getExistingDirectory(self, 'Open File', 'DATA')
        self.App(directoryName)

    def App(self, directory):

        self.addText(u'Поикс файлов в указанной дерриктории '+str(directory), 1)
        if len(directory) == 0:
            self.addText(u"В папке '"+ str(directory) +u"' не обнаружены файлы", 2)
            self.arExName = []
            return
        else:

            for root, dir, files in os.walk(str(directory)):
                for name in files:
                    f_src = os.path.join(root, name)
                    if f_src.endswith('.xlsx') or f_src.endswith('.xls'):
                        self.arExName.append(f_src)
                        self.addText(f_src, 3)
            if len(self.arExName) == 0:
                print str(directory)
                self.addText(u"В папке '"+ str(directory) +u"' не обнаружены файлы Excel", 3)
                self.arExName = []
            print self.arExName


    def Run1(self):
        if os.path.isfile("result/res.xlsx"):
            os.unlink("result/res.xlsx")

        wbRES = openpyxl.Workbook() #openpyxl.Workbook(filename='result/res.xlsx')
        sheetRES = wbRES.active#[u'Лист1']

        wbTemp = openpyxl.load_workbook(filename=str(self.tempFileName))
        sheetTemp = wbTemp.active


        indexTemp = 0
        numCategory = 0
        val = []
        self.listCategory = []
        constAttr = []
        while sheetTemp["A"+str(indexTemp+1)].value != None:

            if sheetTemp["E"+str(indexTemp+1)].value == "*":
                constAttr.append(indexTemp)
            
            if indexTemp > 1 and sheetTemp["B"+str(indexTemp)].value != None:
                val.append(sheetTemp["B"+str(indexTemp)].value)
                val.append(indexTemp)
                self.listCategory.append(val)
                numCategory += 1
                val = []

            indexTemp += 1

        if len(self.arExName) == 0:
            self.addText(u"Для выполнения данных действий, необходимо указать папку с файлами Excel", 3)
            self.SelectFolder()
            return  None

        if len(self.tempFileName) == 0:
            self.addText(u"Для выполнения данных действий необходимо указать файл шаблон, который описывает структуру анализируемых файлов ",3)
            return None

        vals = []
        val = []
        dataCol = []
        check = 0

        for nameEx in self.arExName:
            print nameEx
            wb = openpyxl.load_workbook(filename=nameEx)
            sheet = wb[u'Лист1']
            for v in sheet.range('D2:D'+str(indexTemp)):

                if v[0].value == 0 or v[0].value < 0 :
                    destination = "ERROR"
                    shutil.move(nameEx, destination)
                    self.arExName.remove(nameEx)
                    val = []
                    break
                else:
                    if check == 0:
                        for row in sheet.iter_rows('A2:C'+str(indexTemp)):
                            for cell in row:
                                val.append(cell.value)
                            dataCol.append(val)
                            val = []
                        check = 1
                    val.append(v[0].value)
            print len(val)
            print val
            if val != None:
                vals.append(val)
            val = []

        AVG = 0
        valsRES = []


        print len(self.arExName)
        print vals
        result = 0
        for i in xrange(0, len(vals[0])):
            #print i
            for j in xrange(0, len(self.arExName)):
                #print j
                result = result + vals[j][i]
            valsRES.append(round(result / len(self.arExName), 2))
            AVG = AVG + result / len(self.arExName)
            if i == len(vals[0]) - 1:
                AVG = AVG / i
            result = 0

        listRES = []

        for indexARG in xrange(0, len(valsRES)):
            if indexARG+1 in constAttr or valsRES[indexARG] > AVG:
                listRES.append(dataCol[indexARG])
                listRES[len(listRES)-1].append(valsRES[indexARG])

        index = 1
        lastPos = 1
        for arr in listRES:
            sheetRES['A'+str(index+1)] = index

            for category in xrange(0,len(self.listCategory)):
                lastPos = self.listCategory[category][1]

                try:
                    nextPos = self.listCategory[category+1][1]
                except:
                    nextPos = indexTemp
                if arr[0] in xrange(lastPos-1,nextPos-1):
                    sheetRES['B'+str(index+1)] = self.listCategory[category][0]

                    break

            sheetRES['C'+str(index+1)] = arr[2]
            sheetRES['D'+str(index+1)] = arr[3]

            print arr[0], arr[1], arr[2], arr[3]
            index += 1
            try:
                wbRES.save('result/res.xlsx')
            except:
                self.addText("Произожша ошибка во время сохранения данных", 2)
                return

        self.addText(u"Расчитанные данные сохранены в файл res.xlsx, расположенном в папке 'result'", 2)
        self.addText(u"1-ая итерация успешно завершена", 1)

    def Run2(self):
        if not os.path.isfile("result/res.xlsx"):
            self.addText(u"Файл с результатами первой итерации не обнаружен. Выполните первую итерацию расчета данных прежде чем перейти к следующему шагу.", 2)
            return None

        wbRES = openpyxl.load_workbook(filename='result/res.xlsx')
        sheetRES = wbRES[u'Sheet']

        # Удаление файлов из патки
        folder = 'result/Criterion/'
        for the_file in os.listdir(folder):
            file_path = os.path.join(folder, the_file)
            try:
                if os.path.isfile(file_path):
                    os.unlink(file_path)
        #elif os.path.isdir(file_path): shutil.rmtree(file_path)
            except Exception, e:
                print e

        listCat = self.listCategory
        index = 2
        data = []
        val = []

        for i in xrange(0, len(listCat)):
            data.append([])


        while sheetRES['B'+ str(index)].value != None:
            cell_B = sheetRES['B'+ str(index)].value
            for item in listCat:
                if cell_B in item:
                    val.append(sheetRES['C'+str(index)].value)
                    val.append(sheetRES['D'+str(index)].value)
                    numCat = listCat.index(item)
                    data[numCat].append(val)
                    val = []
                    break
            index += 1
        wbRES.save("result/res.xlsx")

        for i in xrange(0,len(data)):
            category = i + 1
            self.calkValue(data[i],category)
        self.addText(u"2-ая итерация успешно завершена", 1)

    def calkValue(self, data, numCriterion):
        self.addText(u"Выполняются вычисления Категории"+ str(numCriterion) +  u" , подождите ...", 2)
        vals = []
        index = 0
        val = []
        valInd = [[u"Критерии"]]

        for v in data:
            val.append(v[0])
            vals.append(val)
            valInd[0].append(val[0])
            val = []
            for w in data:
                val.append(w[1])
                vals[index].append(val)
                val = []
            index += 1

        valInd[0].append(u"Сумма баллов, Бi")
        valInd[0].append(u"Ранг, Pi")

        index = 1
        indexARG = 1
        val = []

        for v in vals:
            val.append(v[0])
            valInd.append(val)
            val = []
            nextIndexARG = 0
            for w in vals:
                if w[indexARG] == w[nextIndexARG + 1]:
                    valInd[index].append(1)
                elif w[indexARG] > w[nextIndexARG + 1]:
                    valInd[index].append(2)
                else:
                    valInd[index].append(0)

                nextIndexARG += 1
                val = []
            indexARG += 1
            index += 1



        indexStr = 0
        for string in valInd:
            if len(string) < len(valInd[0]):
                valInd[indexStr].append(Score(string))
                valInd[indexStr].append(Rang(string))
                indexStr += 1
            else:
                indexStr += 1
                continue
        avgElement = 0
        colRing = 0
        for string in valInd:
            for avgEl in string[len(string)-2: len(string)-1]:
                if is_number(avgEl) == True:
                    avgElement += avgEl
                    colRing += 1
        avgElement = avgElement/colRing

        # Удалить все показатели которые ниже среднего
        dellList = []
        for listElement in valInd:
            element = listElement[len(listElement)-2:len(listElement)-1][0]

            if is_number(element) == True:
                print str(element) + '%' + str(avgElement)
                if element  < avgElement:
                    dellList.append(listElement)

        for dell in dellList:
            valInd.remove(dell)


        urlCategoryFile = 'result/Criterion/Criterion'+str(numCriterion)+'.xlsx'
        try:
            wbCat = openpyxl.load_workbook(urlCategoryFile)
        except:
            wbCat = openpyxl.Workbook()
        sheet = wbCat.active

        if sheet.title != "Criterion":
            sheet.title = "Criterion"

        val = valInd
        indexStr = 0
        for i in xrange(65,(65+int(len(valInd[0])))):
            row = chr(i)
            for j in xrange(1,len(valInd)+1):
                indexElem = j - 1
                sheet[str(row) + str(j)] = val[indexElem][indexStr]
            indexStr += 1
        self.addText(u"Вычисления Категории"+ str(numCriterion) +  u" окончены ...", 3)
        wbCat.save(urlCategoryFile)
        self.addText(u"Результаты вычисления сохранены в файле Category"+str(numCriterion) +u".xlsx. Путь к файлу result/Category/Category"+ str(numCriterion)+".xlsx", 3)


    def Event1(self):
        reply = QMessageBox.question(self, u'Сообщение', u"Выполнить 1-ую итерацию?",
                                 QMessageBox.No, QMessageBox.Yes)

        if reply == QMessageBox.Yes:
            self.addText(u"Выполняется 1-ая итерация.", 1)
            self.Run1()

    def Event2(self):
        reply = QMessageBox.question(self, u'Сообщение', u"Выполнить 2-ую итерацию?",
                                 QMessageBox.No, QMessageBox.Yes)

        if reply == QMessageBox.Yes:
            self.addText(u"Выполняется 2-ая итерация.", 1)
            self.Run2()


class build(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)



app = QtGui.QApplication(sys.argv)
mw = MainWindows()
mw.show()
sys.exit(app.exec_())

