# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division

import sqlite3
import Image
from StringIO import StringIO

from settings import covers_db_path

class Covers(dict):
    def __init__(self, db):
        self._db = db

    def connect(self):
        self.conn = sqlite3.connect(self._db, timeout=10)
        self.create()

    def create(self):
        c = self.conn.cursor()
        c.execute(u'CREATE TABLE IF NOT EXISTS cover (id varchar(64) unique, data blob)')
        c.execute(u'CREATE TABLE IF NOT EXISTS setting (key varchar(256) unique, value text)')
        if int(self.get_setting(c, 'version', 0)) < 1:
            self.set_setting(c, 'version', 1)

    def get_setting(self, c, key, default=None):
        c.execute(u'SELECT value FROM setting WHERE key = ?', (key, ))
        for row in c:
            return row[0]
        return default

    def set_setting(self, c, key, value):
        c.execute(u'INSERT OR REPLACE INTO setting values (?, ?)', (key, str(value)))

    def black(self):
        img = Image.new('RGB', (80, 128))
        o = StringIO()
        img.save(o, format='jpeg')
        data = o.getvalue()
        o.close()
        return data

    def __getitem__(self, id, default=None):
        sql = u'SELECT data FROM cover WHERE id=?'
        self.connect()
        c = self.conn.cursor()
        c.execute(sql, (id, ))
        data = default
        for row in c:
            data = row[0]
            break
        c.close()
        self.conn.close()
        return data

    def __setitem__(self, id, data):
        sql = u'INSERT OR REPLACE INTO cover values (?, ?)'
        self.connect()
        c = self.conn.cursor()
        data = sqlite3.Binary(data)
        c.execute(sql, (id, data))
        self.conn.commit()
        c.close()
        self.conn.close()

    def __delitem__(self, id):
        sql = u'DELETE FROM cover WHERE id = ?'
        self.connect()
        c = self.conn.cursor()
        c.execute(sql, (id, ))
        self.conn.commit()
        c.close()
        self.conn.close()

covers = Covers(covers_db_path)