# -*- coding: utf-8 -*-
""" 一卡通后台通讯协议包封装
所有数据都是 unicode  utf-8 编码
"""
import traceback
import simplejson as json


def _unicode_str(value):
    if isinstance(value, str):
        return value.decode('utf-8')
    elif isinstance(value, unicode):
        return value
    else:
        return unicode(value)


class message_writer:
    """ 后台消息写接口
    """
    def __init__(self):
        self.clear()

    def clear(self):
        self._attr = {}
        self._row_data = []
        self._col_names = []
        self._row = {}
        self._frozen = False

    def attr(self, name, value):
        if name in self._attr:
            raise ValueError('Attribute [%s] already exists' % name)
        self._attr[name] = _unicode_str(value)
        return self

    def row(self, name, value):
        if not (name in self._col_names):
            self._col_names.append(name)
        self._row[name] = _unicode_str(value)

    def add_row(self):
        if not self._row:
            raise ValueError('Row has no values')
        self._row_data.append(self._row)
        self._row = {}
        return len(self._row_data)

    def append_row(self, row):
        if not self._col_names:
            for k, v in row.iteritems():
                self._col_names.append(k)
            self._row_data.append(row)
        else:
            new_row = dict([(v, row.get(v, None)) for v in self._col_names])
            self._row_data.append(new_row)

    def _normalize(self):
        colcnt = len(self._col_names)
        rowcnt = len(self._row_data)
        self._attr["colcnt"] = colcnt
        self._attr["rowcnt"] = rowcnt
        if colcnt > 0:
            self._attr["colname"] = self._col_names
            self._attr["coldesc"] = self._col_names

        if rowcnt > 0 and colcnt <= 0:
            raise ValueError(u'数据没有列值')

        if rowcnt > 0:
            self._attr["rowdata"] = [[row.get(colname, u"") for colname in self._col_names]
                for row in self._row_data]
        self._frozen = True

    def serialize(self):
        """ 返回 unicode utf-8编码
        """
        if not self._frozen:
            self._normalize()
        seri = json.dumps(self._attr, ensure_ascii=False, encoding='utf-8')
        return seri

    def root(self):
        if not self._frozen:
            self._normalize()
        return self._attr


class message_reader:
    """ 后台消息读接口
    """
    def __init__(self):
        self.clear()

    def clear(self):
        """ 清空数据
        """
        self._attr = {}
        self._row_data = None
        self._col_names = []
        self._col_desc = []
        self._row_no = -1
        self._frozen = False

    def unserialize(self, message):
        """ 解析报文
        """
        self.clear()
        try:
            message = _unicode_str(message)
            obj = json.loads(message)
            #obj = json.loads(msg.replace('\\',"\\\\"))
        except Exception, ex:
            traceback.print_exc()
            raise ValueError(u'解析报文错误,' + ex.message)

        if u"colname" in obj:
            colname = obj[u"colname"]
            colcnt = obj[u"colcnt"]
            rowcnt = obj[u"rowcnt"]

            if colcnt != len(colname):
                raise ValueError(u'记录列数定义不符')

            rowdata = obj[u"rowdata"]
            if rowcnt != len(rowdata):
                raise ValueError(u'记录行数定义不符')

            self._row_data = [dict(zip(colname, row)) for row in rowdata]
            self._col_names = colname
            self._col_desc = obj["coldesc"]
        else:
            pass

        for n, v in obj.iteritems():
            if n in (u"colname", u"colcnt", u"rowcnt", u"coldesc", u"rowdata"):
                continue
            self._attr[n] = v
        self._frozen = True
        #print self._attr

    def attr(self, name):
        """ 获取属性值，如果没有改属性返回空字符串
        """
        assert self._frozen == True
        if name not in self._attr:
            return ""
        return self._attr[name]

    def has_more_row(self):
        """ 判断是否有后续行
        """
        assert self._frozen == True
        if not self._row_data:
            return False
        if self._row_no < len(self._row_data):
            return True
        return False

    def next_row(self):
        """ 将读取指针移到下一行
        """
        assert self._frozen == True
        assert self.has_more_row()
        self._row_no += 1

    _ARG_DEFAULT = []

    def col(self, name, default=[], strip=True):
        """ 获取当前行的字段值
        """
        assert self._row_no >= 0
        arg = self._row_data[self._row_no].get(name, None)
        if not arg:
            if strip and default == message_reader._ARG_DEFAULT:
                raise IndexError(u'no such column %s' % name)
            return default
        return arg

    def is_eof(self):
        """判断是否到记录尾
        """
        if self._row_no >= len(self._row_data):
            return True
        return False

    def fetch_rows(self):
        """ 读取所有行记录
        """
        if not self.has_more_row():
            return
        self._row_no = 0
        for row in self._row_data:
            self._row_no += 1
            yield row
