#!/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()
