#!/usr/bin/python
"""
/***************************************************************************
                               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-ng-style.xml"
dbfile = "../resources/symbology-ng-style.db"

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

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

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

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

_symgroup = "CREATE TABLE symgroup("\
            "id INTEGER PRIMARY KEY,"\
            "name TEXT,"\
            "parent INTEGER)"

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

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

create_tables = [ _symbol, _colorramp, _tag, _tagmap, _ctagmap, _symgroup, _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" )
    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(), 0 ) )
conn.commit()


# ColorRamps
colorramps = dom.getElementsByTagName( "colorramp" )
for ramp in colorramps:
    ramp_name = ramp.getAttribute( "name" )
    c.execute( "INSERT INTO colorramp VALUES (?,?,?,?)", ( None, ramp_name, ramp.toxml(), 0 ) )
conn.commit()

# Finally close the sqlite cursor
c.close()
