"""Tools to work with resource files."""

import configparser
import shutil
import tempfile
# import base64
# import psycopg2
# import psycopg2.extras
import os
from os.path import abspath, join, pardir, dirname
from qgis.core import QgsDataSourceUri
from .SQLRequet import geom, champ_contour, champ_travaux_prevus_multilinestring, champ_travaux_prevus_point, champ_travaux_prevus_multipolygon, champ_vegethab_multipolygon, champ_vegethab_multilinestring, champ_vegethab_point, champ_viergeLigne, champ_viergePoint, champ_viergePolygone
from qgis.PyQt import uic

__copyright__ = "Copyright 2019, 3Liz"
__license__ = "GPL version 3"
__email__ = "info@3liz.org"
__revision__ = "$Format:%H$"


def plugin_path(*args):
    """Get the path to plugin root folder.

    :param args List of path elements e.g. ['img', 'logos', 'image.png']
    :type args: str

    :return: Absolute path to the plugin path.
    :rtype: str
    """
    path = dirname(dirname(__file__))
    path = abspath(abspath(join(path, pardir)))
    for item in args:
        path = abspath(join(path, item))

    return path


def plugin_name():
    """Return the plugin name according to metadata.txt.

    :return: The plugin name.
    :rtype: basestring
    """
    metadata = metadata_config()
    name = metadata["general"]["name"]
    return name


def metadata_config() -> configparser:
    """Get the INI config parser for the metadata file.

    :return: The config parser object.
    :rtype: ConfigParser
    """
    path = plugin_path("metadata.txt")
    config = configparser.ConfigParser()
    config.read(path, encoding='utf8')
    return config


def plugin_test_data_path(*args, copy=False):
    """Get the path to the plugin test data path.

    :param args List of path elements e.g. ['img', 'logos', 'image.png']
    :type args: str

    :param copy: If the file must be copied into a temporary directory first.
    :type copy: bool

    :return: Absolute path to the resources folder.
    :rtype: str
    """
    path = abspath(abspath(join(plugin_path(), "test", "data")))
    for item in args:
        path = abspath(join(path, item))

    if copy:
        temp = tempfile.mkdtemp()
        shutil.copy(path, temp)
        return join(temp, args[-1])
    else:
        return path


def resources_path(*args):
    """Get the path to our resources folder.

    :param args List of path elements e.g. ['img', 'logos', 'image.png']
    :type args: str

    :return: Absolute path to the resources folder.
    :rtype: str
    """
    path = abspath(abspath(join(plugin_path(), "CenRa_POSTGIS\\tools")))
    for item in args:
        path = abspath(join(path, item))
    return path


def load_ui(*args):
    """Get compile UI file.

    :param args List of path elements e.g. ['img', 'logos', 'image.png']
    :type args: str

    :return: Compiled UI file.
    """
    ui_class, _ = uic.loadUiType(resources_path("ui", *args))

    return ui_class


def pyperclip():
    dst = dirname(dirname(__file__)) + "\\tools\\"
    if os.access('N:/', os.R_OK):
        src = 'N:/SI_Systeme d information/Z_QGIS/PLUGIN/PythonSQL.py'
    try:
        shutil.copy(src, dst)
    except FileNotFoundError:
        print('404')
    except UnboundLocalError:
        print('404')


def send_issues(url, titre, body, labels):
    import requests
    import urllib.request
    import json
    # import os
    # import qgis

    # usr = os.environ['USERNAME']
    token = '9d0a4e0bea561710e0728f161f7edf4e5201e112'
    url = url + '?token=' + token

    headers = {'Authorization': 'token ' + token, 'accept': 'application/json', 'Content-Type': 'application/json'}

    payload = {'title': titre, 'body': body, 'labels': labels}
    try:
        urllib.request.urlopen('https://google.com')
        binar = True
    except ValueError:
        binar = False
        r = ''
    if binar:
        r = requests.post(url, data=json.dumps(payload), headers=headers)
    return r


def maj_verif(NAME):
    import qgis
    import urllib.request
    iface = qgis.utils.iface
    from qgis.core import Qgis

    # url = qgis.utils.pluginMetadata(NAME, 'repository')
    # URL = url+'/raw/branch/main/plugins.xml'
    URL = 'https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/plugins.xml'
    # print(URL)
    version = qgis.utils.pluginMetadata(NAME, 'version')
    len_version = len(version)
    try:
        urllib.request.urlopen('https://google.com')
        binar = True
    except urllib.error.URLError:
        binar = False
    if binar:
        try:
            version_web = str(urllib.request.urlopen(URL).read())
            plugin_num = version_web.find(NAME)
            valeur_version_web = version_web.find('<version>', plugin_num) + 9
            version_plugin = version_web[valeur_version_web: valeur_version_web + len_version]
            if version_plugin != version:
                iface.messageBar().pushMessage("MAJ :", "Des mise à jour de plugin sont disponibles.", level=Qgis.Info, duration=30)
        except NameError:
            print("error gitea version ssl")
    else:
        iface.messageBar().pushMessage("WiFi :", "Pas de connection à internet.", level=Qgis.Warning, duration=30)


def devlog(NAME):
    import qgis
    devmaj = '<head><style>* {margin:0; padding:0; }</style></head>'
    devmaj = devmaj + qgis.utils.pluginMetadata(NAME, 'changelog')
    return devmaj


def create_contour(self, schema, cur, con, host, port, dbname, user, mdp):
    # Creation de la table contour
    # Verifie si la checkbox est cochee
    if self.couche_contour.isChecked():
        if self.annee_1.text() == 'aaaa' or self.annee_1.text() == '':
            tablename = schema + "_contour"
        else:
            tablename = schema + "_contour_" + self.annee_1.text()
        tablename_qgis = tablename[1:]  # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis

        RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename + "','gid')"
        SQL_contour = "CREATE TABLE " + schema + "." + tablename + champ_contour

        cur.execute(SQL_contour)
        cur.execute(RETURNE)
        sequence_name = cur.fetchone()[0]

        SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename[len(schema):] + "_pkey" + " PRIMARY KEY (gid)"
        SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();"
        SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();"
        SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();"
        SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();"

        SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time)
        SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now()
        FROM layer_styles
        WHERE description = 'contour_modele_v3'"""
        SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;"

        cur.execute(SQL_pkey)
        cur.execute(SQL_trigger_area_m2)
        cur.execute(SQL_trigger_area_ha)
        cur.execute(SQL_trigger_date_creation)
        cur.execute(SQL_trigger_date_maj)
        # Enregistrement du style (comme style par defaut) dans la table layer_styles
        cur.execute(SQL_style)
        cur.execute(SQL_GRANT_TABLE)

        con.commit()

        # Affichage de la table
        uri = QgsDataSourceUri()
        # set host name, port, database name, username and password
        uri.setConnection(host, port, dbname, user, mdp)
        # set database schema, table name, geometry column and optionaly subset (WHERE clause)
        uri.setDataSource(schema, tablename, geom)

        self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")


def create_travaux(self, schema, cur, con, host, port, dbname, user, mdp):
    # Creation de la table travaux prevus
    if self.couche_travaux_prevus.isChecked():
        # **********Poly
        if self.annee_5.text() == 'aaaa' or self.annee_5.text() == '':
            tablename = schema + "_travaux_prevus_poly"
        else:
            tablename = schema + "_travaux_prevus_poly_" + self.annee_5.text()
        tablename_qgis = tablename[1:]  # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis

        RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename + "','gid')"
        SQL_travaux_prevus = "CREATE TABLE " + schema + "." + tablename + champ_travaux_prevus_multipolygon

        cur.execute(SQL_travaux_prevus)
        cur.execute(RETURNE)
        sequence_name = cur.fetchone()[0]

        SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename[len(schema):] + "_pkey" + " PRIMARY KEY (gid)"
        SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();"
        SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();"
        SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();"
        SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();"

        SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time)
        SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now()
        FROM layer_styles
        WHERE description = 'travaux_prevus_poly_modele_v3'"""
        SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;"

        cur.execute(SQL_pkey)
        cur.execute(SQL_trigger_date_creation)
        cur.execute(SQL_trigger_date_maj)
        cur.execute(SQL_trigger_area_m2)
        cur.execute(SQL_trigger_area_ha)
        # Enregistrement du style (comme style par defaut) dans la table layer_styles
        cur.execute(SQL_style)
        cur.execute(SQL_GRANT_TABLE)

        con.commit()

        # Affichage de la table
        uri = QgsDataSourceUri()
        # set host name, port, database name, username and password
        uri.setConnection(host, port, dbname, user, mdp)
        # set database schema, table name, geometry column and optionaly subset (WHERE clause)
        uri.setDataSource(schema, tablename, geom)

        self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")

        # **********ligne
        if self.annee_5.text() == 'aaaa' or self.annee_5.text() == '':
            tablename = schema + "_travaux_prevus_ligne"
        else:
            tablename = schema + "_travaux_prevus_ligne_" + self.annee_5.text()
        tablename_qgis = tablename[1:]  # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis

        RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename + "','gid')"
        SQL_travaux_prevus = "CREATE TABLE " + schema + "." + tablename + champ_travaux_prevus_multilinestring

        cur.execute(SQL_travaux_prevus)
        cur.execute(RETURNE)
        sequence_name = cur.fetchone()[0]

        SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename[len(schema):] + "_pkey" + " PRIMARY KEY (gid)"
        SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();"
        SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();"
        SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();"
        SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();"

        SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time)
        SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now()
        FROM layer_styles
        WHERE description = 'travaux_prevus_ligne_modele_v3'"""
        SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;"

        cur.execute(SQL_pkey)
        cur.execute(SQL_trigger_date_creation)
        cur.execute(SQL_trigger_date_maj)
        cur.execute(SQL_trigger_length_m)
        cur.execute(SQL_trigger_length_km)
        # Enregistrement du style (comme style par defaut) dans la table layer_styles
        cur.execute(SQL_style)
        cur.execute(SQL_GRANT_TABLE)

        con.commit()

        # Affichage de la table
        uri = QgsDataSourceUri()
        # set host name, port, database name, username and password
        uri.setConnection(host, port, dbname, user, mdp)
        # set database schema, table name, geometry column and optionaly subset (WHERE clause)
        uri.setDataSource(schema, tablename, geom)

        self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")

        # **********point
        if self.annee_5.text() == 'aaaa' or self.annee_5.text() == '':
            tablename = schema + "_travaux_prevus_point"
        else:
            tablename = schema + "_travaux_prevus_point_" + self.annee_5.text()
        tablename_qgis = tablename[1:]  # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis

        RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename + "','gid')"
        SQL_travaux_prevus = "CREATE TABLE " + schema + "." + tablename + champ_travaux_prevus_point

        cur.execute(SQL_travaux_prevus)
        cur.execute(RETURNE)
        sequence_name = cur.fetchone()[0]

        SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename[len(schema):] + "_pkey" + " PRIMARY KEY (gid)"
        SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();"
        SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();"
        SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();"

        SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time)
        SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now()
        FROM layer_styles
        WHERE description = 'travaux_prevus_point_modele_v3'"""
        SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;"

        cur.execute(SQL_pkey)
        cur.execute(SQL_trigger_date_creation)
        cur.execute(SQL_trigger_date_maj)
        cur.execute(SQL_trigger_coordonnees)
        # Enregistrement du style (comme style par defaut) dans la table layer_styles
        cur.execute(SQL_style)
        cur.execute(SQL_GRANT_TABLE)

        con.commit()

        # Affichage de la table
        uri = QgsDataSourceUri()
        # set host name, port, database name, username and password
        uri.setConnection(host, port, dbname, user, mdp)
        # set database schema, table name, geometry column and optionaly subset (WHERE clause)
        uri.setDataSource(schema, tablename, geom)

        self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")


def create_habita(self, schema, cur, con, host, port, dbname, user, mdp):
    # Creation de la table habitat
    if self.couche_habitat.isChecked():
        if self.annee_2.text() == 'aaaa' or self.annee_2.text() == '':
            tablename = schema + "_habitat"
        else:
            tablename = schema + "_habitat_" + self.annee_2.text()

        tablename_1 = tablename + "_points"
        RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename_1 + "','gid')"
        tablename_qgis = tablename_1[1:]  # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis
        SQL_VEGETHAB = "CREATE TABLE " + schema + "." + tablename_1 + champ_vegethab_point

        print(RETURNE)
        print('')
        print(SQL_VEGETHAB)
        cur.execute(SQL_VEGETHAB)
        cur.execute(RETURNE)
        sequence_name = cur.fetchone()[0]

        SQL_pkey = "ALTER TABLE " + schema + "." + tablename_1 + " ADD CONSTRAINT " + tablename_1 + "_pkey" + " PRIMARY KEY (gid)"
        SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename_1 + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename_1 + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();"
        SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time)
        SELECT f_table_catalog, '""" + schema + "', '" + tablename_1 + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now()
        FROM layer_styles
        WHERE description = 'vegethab_points_modele_v3'"""
        SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename_1 + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename_1 + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;"

        cur.execute(SQL_pkey)
        cur.execute(SQL_trigger_coordonnees)
        cur.execute(SQL_style)
        cur.execute(SQL_GRANT_TABLE)

        con.commit()
        # Affichage de la table
        uri = QgsDataSourceUri()
        # set host name, port, database name, username and password
        uri.setConnection(host, port, dbname, user, mdp)
        # set database schema, table name, geometry column and optionaly subset (WHERE clause)
        uri.setDataSource(schema, tablename_1, geom)

        self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")

        tablename_2 = tablename + "_lignes"
        RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename_2 + "','gid')"
        tablename_qgis = tablename_2[1:]
        SQL_VEGETHAB = "CREATE TABLE " + schema + "." + tablename_2 + champ_vegethab_multilinestring

        cur.execute(SQL_VEGETHAB)
        cur.execute(RETURNE)
        sequence_name = cur.fetchone()[0]

        SQL_pkey = "ALTER TABLE " + schema + "." + tablename_2 + " ADD CONSTRAINT " + tablename_2[len(schema):] + "_pkey" + " PRIMARY KEY (gid)"
        SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename_2 + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename_2 + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();"
        SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename_2 + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename_2 + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();"
        SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time)
        SELECT f_table_catalog, '""" + schema + "', '" + tablename_2 + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now()
        FROM layer_styles
        WHERE description = 'vegethab_lignes_modele_v3'"""
        SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename_2 + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename_2 + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;"

        cur.execute(SQL_pkey)
        cur.execute(SQL_trigger_length_m)
        cur.execute(SQL_trigger_length_km)
        cur.execute(SQL_style)
        cur.execute(SQL_GRANT_TABLE)

        con.commit()
        # Affichage de la table
        uri = QgsDataSourceUri()
        # set host name, port, database name, username and password
        uri.setConnection(host, port, dbname, user, mdp)
        # set database schema, table name, geometry column and optionaly subset (WHERE clause)
        uri.setDataSource(schema, tablename_2, geom)

        self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")

        tablename_3 = tablename + "_polygones"
        RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename_3 + "','gid')"
        tablename_qgis = tablename_3[1:]
        SQL_VEGETHAB = "CREATE TABLE " + schema + "." + tablename_3 + champ_vegethab_multipolygon

        cur.execute(SQL_VEGETHAB)
        cur.execute(RETURNE)
        sequence_name = cur.fetchone()[0]

        SQL_pkey = "ALTER TABLE " + schema + "." + tablename_3 + " ADD CONSTRAINT " + tablename_3[len(schema):] + "_pkey" + " PRIMARY KEY (gid)"
        SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename_3 + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename_3 + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();"
        SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename_3 + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename_3 + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();"
        SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time)
        SELECT f_table_catalog, '""" + schema + "', '" + tablename_3 + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now()
        FROM layer_styles
        WHERE description = 'vegethab_polygones_modele_v3'"""
        SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename_3 + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename_3 + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;"

        cur.execute(SQL_pkey)
        cur.execute(SQL_trigger_area_m2)
        cur.execute(SQL_trigger_area_ha)
        cur.execute(SQL_style)
        cur.execute(SQL_GRANT_TABLE)

        con.commit()
        # Affichage de la table
        uri = QgsDataSourceUri()
        # set host name, port, database name, username and password
        uri.setConnection(host, port, dbname, user, mdp)
        # set database schema, table name, geometry column and optionaly subset (WHERE clause)
        uri.setDataSource(schema, tablename_3, geom)

        self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")


def create_vierge(self, schema, cur, con, host, port, dbname, user, mdp):
    # Creation de la table vierge
    if self.couche_vierge.isChecked():
        if self.annee_4.text() == 'aaaa' or self.annee_4.text() == '':
            tablename = schema + "_" + self.nom_couche_vierge.text().lower()
        else:
            tablename = schema + "_" + self.nom_couche_vierge.text().lower() + "_" + self.annee_4.text()
        tablename_qgis = tablename[1:]  # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis

        if self.couche_vierge_point.isChecked() == 1:
            champ_vierge = champ_viergePoint

        if self.couche_vierge_ligne.isChecked() == 1:
            champ_vierge = champ_viergeLigne

        if self.couche_vierge_polygone.isChecked() == 1:
            champ_vierge = champ_viergePolygone

        RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename + "','gid')"
        SQL_vierge = "CREATE TABLE " + schema + "." + tablename + champ_vierge

        cur.execute(SQL_vierge)
        cur.execute(RETURNE)
        sequence_name = cur.fetchone()[0]

        SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename[len(schema):] + "_pkey" + " PRIMARY KEY (gid)"

        SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();"
        SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();"
        SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();"
        SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();"
        SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();"
        SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;"

        cur.execute(SQL_pkey)
        cur.execute(SQL_GRANT_TABLE)

        if self.couche_vierge_point.isChecked() == 1:
            cur.execute(SQL_trigger_coordonnees)

        if self.couche_vierge_ligne.isChecked() == 1:
            cur.execute(SQL_trigger_length_m)
            cur.execute(SQL_trigger_length_km)

        if self.couche_vierge_polygone.isChecked() == 1:
            cur.execute(SQL_trigger_area_m2)
            cur.execute(SQL_trigger_area_ha)

        con.commit()

        # Affichage de la table
        uri = QgsDataSourceUri()
        # set host name, port, database name, username and password
        uri.setConnection(host, port, dbname, user, mdp)
        # set database schema, table name, geometry column and optionaly subset (WHERE clause)
        uri.setDataSource(schema, tablename, geom)

        self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
