# -*- coding: utf-8 -*-

import struct
from tools import split_bits


class OBJECT_TYPE(object):
    LINE = 'LINE'
    VECTOR = 'VECTOR'
    AREA = 'AREA'
    POINT = 'POINT'
    LABEL = 'LABEL'
    LABEL_TEMPLATE = 'LABEL_TEMPLATE'


class RscSemanticDefaultsObject(object):

    def __init__(self):
        self.errors = []
        self.id = None
        self.connected_labels = []

    @staticmethod
    def parse(data):
        record = RscSemanticClassifierObject()
        record.parse_record(data)
        return record

    def info(self):
        print u'Classifier Object %s <%s> "%s"' % (
            self.id,
            self.short_name.decode('cp1251'),
            self.name.decode('cp1251'),
        )

    def parse_record(self, data):
        """2.1.8 Структура таблицы  порогов
        Таблица порогов представляет собой двоичное описание серии объектов.
        Серия объектов это несколько объектов с одинаковым кодом, локализацией и семантикой. Серия предназначена для отображения объектов классификатора в тех случаях, когда объект должен менять внешний вид в зависимости от значений семантики (одной или двух). Описание каждого объекта серии лежит отдельно, а таблица порогов позволяет узнать, какой именно объект серии соответствует данному сочетанию значений семантических характеристик.
        Перед таблицей порогов находится идентификатор таблицы “.LIM” (шестнадцатеричное число 0X004D494C)  (не входит в длину таблицы).  Записи таблицы порогов переменной длины. """

        # Назначение поля Смещение    Длина   Комментарий
        # Длина записи    0   4   В байтах, с учетом длины ограничителей и матрицы расширений (N7)
        # Классификационный код   4   4   Общий код для всех объектов серии
        # Локализация 8   1   Общая для всех объектов серии
        # Резерв  9   7   В байтах
        # Код первой семантики    16  4   Код семантики, влияющей на вид объекта
        # Количество ограничителей по первой семантике    20  2   Число от 0 до 255 (N8)
        # Номер умалчиваемого ограничителя по первой семантике    22  2   Примечание 1.
        # Код второй семантики    24  4   Код семантики, влияющей на вид объекта. При отсутствии второй семантики 0
        # Количество ограничителей по второй семантике    28  2   Число от 0 до 255 (N9)
        # Номер умалчиваемого ограничителя по второй семантике    30  2   Примечание 1.
        # Ограничители по первой семантике    32  8*N8    Ограничители упорядочены по возрастанию
        # Ограничители по второй семантике    +32+8*N8    8*N9    Ограничители упорядочены по возрастанию
        # Матрица расширений  +32 +8 * (N8+N9)    N8*N9 если N9=0 N8  Значениями матрицы являются номера расширений объектов (Числа от 0 до 255)
        # ИТОГО:  N7

        # Примечания: Ограничители семантики упорядочены по возрастанию и показывают граничные значения семантики, при которых вид объекта будет меняться. Нижняя граница не включается в интервал значений, а верхняя включается. Если семантика объекта, влияет на вид объекта, а значение ее не установлено, будет выбрано значение умалчиваемого ограничителя. Матрицу расширений можно рассматривать как следующую таблицу:

        # Семантики 2\1   Ограничители 1 семантики < 1 огр <2 огр … <n огр
        # Ограничители 2 семантики    1 расширение    2 расширение
        #     N+1 расширение  Матрица расширений
        self.full_length = struct.unpack('<I', data[0:4])[0]
