#-*- coding: UTF-8 -*-
#-------------------------------------------------------------------------------
# Name:        Change LYR dataSource
# Purpose:     Changement des sources de données dans LYR pour mise en
#              forme des fonds de plan RGE
#
# Author:      Alice SALSE
#
# Created:     01/07/2016
# Copyright:   (c) SALSE 2016
#-------------------------------------------------------------------------------

from __future__ import unicode_literals

import arcpy
import traceback
import tkMessageBox
import os
import sys
## sys.setdefaultencoding("utf-8")

# ===================================================================
# Paramètres d'environnement arcpy
# ===================================================================
arcpy.env.transferDomains = "false"
arcpy.env.qualifiedFieldNames = "false"
arcpy.env.overwriteOutput = "true"

# ===================================================================
# Paramètres en entrée
# ===================================================================
dataFolder = sys.path[0]

lyrStd = dataFolder + os.sep + "XXXXXrge.lyr"

# ===================================================================
# Création fichier de log et gestion alertes
# ===================================================================
import logging, logging.config

path = sys.path[0]
logging.config.fileConfig(br'{0}\log.conf'.format(path))
logger = logging.getLogger('file')

listWarning = []

class CreateLogFile:
    def info(self, message) :
        logger.info(message)
        arcpy.AddMessage(message)
    def showInfo(self, message) :
        logger.info(message)
        tkMessageBox.showinfo("INFO", message)
    def warning(self, message):
        logger.warning(message)
        arcpy.AddWarning(message)
        listWarning.append(message)
    def showWarning(self, message):
        logger.warning(message)
        listWarning.append(message)
        tkMessageBox.showwarning("WARNING", message)
    def showWarningList(self):
        if len(listWarning) > 0:
            tkMessageBox.showwarning("WARNING", "\n".join(listWarning))
    def error(self, message):
        arcpy.AddError(message)
        logger.error(message)
        tkMessageBox.showerror("ERROR", message)
        sys.exit(message)

log = CreateLogFile()

# ===================================================================
# Fonctions
# ===================================================================
def find_prefix_datasets():
    FCs = arcpy.ListFeatureClasses("*rge*.shp")
    GDB = arcpy.ListWorkspaces("*" ,"FileGDB")
    if len(FCs) == 0 and len(GDB) == 0 :
        log.error("Pas de données valides à traiter")
    elif len(FCs) > 0 and len(GDB) > 0 :
        log.error("L'outil ne peut pas traiter des données shp et gdb en même temps")
    elif len(FCs) > 0 :
        listPrefix = []
        for FC in FCs :
            prefixName = FC[:FC.index("rge")]
            if prefixName not in listPrefix:
                listPrefix.append(prefixName)
    elif len(GDB) > 0 :
        arcpy.env.workspace = GDB[0]
        FCs = arcpy.ListFeatureClasses("*rge*", )
        listPrefix = []
        for FC in FCs :
            prefixName = FC[:FC.index("rge")]
            if prefixName not in listPrefix:
                listPrefix.append(prefixName)

    return listPrefix

def copy_and_rename_lyrs_files(listPrefix):
    listNewsLyrs = []
    if arcpy.Exists(lyrStd):
        if len(listPrefix) > 1:
            for prefixName in listPrefix[:-1] :
                log.info("Copie le fichier {0}rge.lyr dans le répertoire de données".format(prefixName))
                newLyr = arcpy.Copy_management(lyrStd, dataFolder + os.sep + prefixName + "rge.lyr")
                listNewsLyrs.append([str(newLyr), prefixName])
        log.info("Renomme le fichier {0}rge.lyr dans le répertoire de données".format(listPrefix[-1]))
        newLyr = arcpy.Rename_management(lyrStd, dataFolder + os.sep + listPrefix[-1] + "rge.lyr")
        listNewsLyrs.append([str(newLyr), listPrefix[-1]])
    else:
        arcpy.env.workspace = dataFolder
        if len(arcpy.ListFiles("*rge.lyr")) > 0:
            log.error("Le fichier lyr a déjà été converti")
        else:
            log.error("Le fichier \"XXXXXrge.lyr\" n'existe pas dans dans le répertoire")

    return listNewsLyrs

def change_lyr_datasource(listNewsLyrs):
    for lyrFile, prefixName in listNewsLyrs :
        log.info("Changement des sources de données de {0}rge.lyr".format(prefixName))
        layers = arcpy.mapping.Layer(lyrFile)
        layers.name = prefixName + " RGE"
        for layer in layers :
            if layer.isFeatureLayer == True:
                fcName = layer.datasetName[5:]
                findFC = arcpy.ListFeatureClasses(prefixName + fcName + "*")
                if len(findFC) == 1:
                    newFcName = arcpy.Describe(findFC[0]).baseName
                    log.info(">>" + layers.name + ": changement de la source de données pour la couche : " + layer.longName)
                    if arcpy.Describe(arcpy.env.workspace).workspaceType == "LocalDatabase" :
                        layer.replaceDataSource(arcpy.env.workspace, "FILEGDB_WORKSPACE", newFcName, True)
                    elif arcpy.Describe(arcpy.env.workspace).workspaceType == "FileSystem" :
                        layer.replaceDataSource(arcpy.env.workspace, "SHAPEFILE_WORKSPACE", newFcName, True)
                else :
                    log.warning(">>" + layers.name + ": pas de source de données pour la couche : " + layer.longName)
        layers.save()

def delete_script():
    thisScript = sys.argv[0]
    logConf = dataFolder + os.sep + "log.conf"
    os.remove(logConf)
    os.remove(thisScript)

# ===================================================================
# FONCTION PRINCIPALE
# ===================================================================
def main():
    try:
        log.info("\nDEBUT DU TRAITEMENT\n===================================================================\n")

        arcpy.env.workspace = dataFolder
        listPrefix = find_prefix_datasets()
        listNewsLyrs = copy_and_rename_lyrs_files(listPrefix)
        change_lyr_datasource(listNewsLyrs)

        delete_script()
        log.showWarningList()
        log.showInfo("Traitement terminé avec succès !")
        log.info("\n===================================================================\nFIN DU TRAITEMENT\n")

    except arcpy.ExecuteError:
        log.error("________________________________________\n\nArcPy Errors:\n" + arcpy.GetMessages(2) + "\n________________________________________\n")

    except:
        tbinfo = traceback.format_tb(sys.exc_info()[2])
        log.error("________________________________________\n\nPython Errors:\n" + "".join([info.decode('utf-8') for info in tbinfo]) + "\n\nError Info:\n"+ unicode(sys.exc_info()[1]) + "\n\nArcPy Errors:\n" + arcpy.GetMessages(2) + "\n________________________________________\n")

if __name__ == '__main__':
    main()
