#!/usr/bin/env python3
"""
/***************************************************************************
                               symbol_xml2db.py
                              -------------------
    begin                : 26-5-2012
    copyright            : (C) 2012 by Arunmozhi
    email                : aruntheguy at gmail dot com
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

    The script creates a sqlite3 Db for storing the symbols which will be
    shipped with QGIS by default. It then converts symbols and colorramps
    in the symbology_ng_style.xml to the database table entries.
"""
import sqlite3

from xml.dom.minidom import parse, parseString

xmlfile = "../resources/symbology-style.xml"
dbfile = "../resources/symbology-style.db"

_symbol = "CREATE TABLE symbol("\
          "id INTEGER PRIMARY KEY,"\
          "name TEXT UNIQUE,"\
          "xml TEXT,"\
          "favorite INTEGER)"

_colorramp = "CREATE TABLE colorramp("\
             "id INTEGER PRIMARY KEY,"\
             "name TEXT UNIQUE,"\
             "xml TEXT,"\
             "favorite INTEGER)"

_tag = "CREATE TABLE tag("\
       "id INTEGER PRIMARY KEY,"\
       "name TEXT)"

_tagmap = "CREATE TABLE tagmap("\
          "tag_id INTEGER NOT NULL,"\
          "symbol_id INTEGER)"

_ctagmap = "CREATE TABLE ctagmap("\
           "tag_id INTEGER NOT NULL,"\
           "colorramp_id INTEGER)"

_smartgroup = "CREATE TABLE smartgroup("\
              "id INTEGER PRIMARY KEY,"\
              "name TEXT,"\
              "xml TEXT)"

create_tables = [_symbol, _colorramp, _tag, _tagmap, _ctagmap, _smartgroup]

# Create the DB with required Schema
conn = sqlite3.connect(dbfile)
c = conn.cursor()
print("Creating tables in the Database\n")
for table in create_tables:
    try:
        c.execute(table)
        print(table)
    except sqlite3.OperationalError as e:
        pass
    conn.commit()

# parse the XML file &  write symbol into DB
dom = parse(xmlfile)
symbols = dom.getElementsByTagName("symbol")
for symbol in symbols:
    symbol_name = symbol.getAttribute("name")
    symbol_favorite = symbol.getAttribute("favorite")
    if not symbol_favorite:
        symbol_favorite = 0

    if '@' in symbol_name:
        parts = symbol_name.split('@')
        parent_name = parts[1]
        layerno = int(parts[2])
        c.execute("SELECT xml FROM symbol WHERE name=(?)", (parent_name,))
        symdom = parseString(c.fetchone()[0]).getElementsByTagName('symbol')[0]
        symdom.getElementsByTagName("layer")[layerno].appendChild(symbol)
        c.execute("UPDATE symbol SET xml=? WHERE name=?", (symdom.toxml(), parent_name))
    else:
        c.execute("INSERT INTO symbol VALUES (?,?,?,?)", (None, symbol_name, symbol.toxml(), symbol_favorite))
conn.commit()


# ColorRamps
colorramps = dom.getElementsByTagName("colorramp")
for ramp in colorramps:
    ramp_name = ramp.getAttribute("name")
    symbol_favorite = symbol.getAttribute("favorite")
    if not symbol_favorite:
        symbol_favorite = 0

    c.execute("INSERT INTO colorramp VALUES (?,?,?,?)", (None, ramp_name, ramp.toxml(), symbol_favorite))
conn.commit()

# Finally close the sqlite cursor
c.close()
