#**************************************************************
#
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#
#**************************************************************

from pseudo import PseudoSet,PseudoOrderedDict
from time import gmtime, strftime

class SdfData:
    _filename        = "";
    _dict            = PseudoOrderedDict()
    _languages_found = [];

    def __init__ (self, filename=""):
        self._filename = filename

    def __getitem__(self, key):
        if key in self._dict:
            return self._dict[key]
        else:
            return None

    def has_key(self, key):
        return key in self._dict

    def __setitem__(self, key, value):
        self._dict[key] = value

    def get_languages_found_in_sdf(self):
        return PseudoSet(self._languages_found)

    def read(self):
        try:
            f = open(self._filename, "r")
            lines = [line.rstrip('\n') for line in f.readlines()]
        except IOError:
            print("ERROR: Trying to read "+ self._filename)
            raise
        else:
            f.close()
        for line in lines:
            entity = SdfEntity()
            entity.set_properties(line)
            self._dict[entity.get_id()] = entity
            self._languages_found.append(entity.langid)

    def write(self, filename):
        try:
            f = open(filename, "w+")
            for value in self._dict.values():
                #f.write( repr(value)+"\n" )
                f.write(value + "\n")
        except IOError:
            print("ERROR: Trying to write " + filename)
            raise
        else:
            f.close()

import sys
class SdfEntity:
    # Sdf format columns
    project         = ""
    source_file     = ""
    dummy1          = ""
    resource_type   = ""
    gid             = ""
    lid             = ""
    helpid          = ""
    platform        = ""
    dummy2          = ""
    langid          = ""
    text            = ""
    helptext        = ""
    quickhelptext   = ""
    title           = ""
    date            = ""

    import const
    const._PROJECT_POS         = 0
    const._SOURCE_FILE_POS     = 1
    const._DUMMY1_POS          = 2
    const._RESOURCE_TYPE_POS   = 3
    const._GID_POS             = 4
    const._LID_POS             = 5
    const._HELPID_POS          = 6
    const._PLATFORM_POS        = 7
    const._DUMMY2_POS          = 8
    const._LANGID_POS          = 9
    const._TEXT_POS            = 10
    const._HELPTEXT_POS        = 11
    const._QUICKHELPTEXT_POS   = 12
    const._TITLE_POS           = 13
    const._DATE_POS            = 14

    def __init__(self, project="", source_file="", dummy1="0", resource_type="", gid="", lid="", helpid="", platform="", dummy2="0", langid="",
                       text="", helptext="", quickhelptext="", title="", date=""):
        self.project        = project;
        self.source_file    = source_file;
        self.dummy1         = dummy1;
        self.resource_type  = resource_type;
        self.gid            = gid;
        self.lid            = lid;
        self.helpid         = helpid;
        self.platform       = platform;
        self.dummy2         = dummy2;
        self.langid         = langid;
        self.text           = text;
        self.helptext       = helptext;
        self.quickhelptext  = quickhelptext;
        self.title          = title;
        if date != "":
            self.date = date;
        else:
            self.date = strftime("%Y-%m-%d %H:%M:%S",gmtime())


    def set_properties(self, line):
        splitted = line.split("\t")
        if len(splitted) == 15:
            self.project        = splitted[ self.const._PROJECT_POS ]
            self.source_file    = splitted[ self.const._SOURCE_FILE_POS ]
            self.dummy1         = splitted[ self.const._DUMMY1_POS ]
            self.resource_type  = splitted[ self.const._RESOURCE_TYPE_POS ]
            self.gid            = splitted[ self.const._GID_POS ]
            self.lid            = splitted[ self.const._LID_POS ]
            self.helpid         = splitted[ self.const._HELPID_POS ]
            self.platform       = splitted[ self.const._PLATFORM_POS ]
            self.dummy2         = splitted[ self.const._DUMMY2_POS ]
            self.langid         = splitted[ self.const._LANGID_POS ]
            self.text           = splitted[ self.const._TEXT_POS ]
            self.helptext       = splitted[ self.const._HELPTEXT_POS ]
            self.quickhelptext  = splitted[ self.const._QUICKHELPTEXT_POS ]
            self.title          = splitted[ self.const._TITLE_POS ]
            self.date           = splitted[ self.const._DATE_POS ]

    def get_file_id(self):
        return self.project + "\\" + self.source_file

    def get_resource_path(self):
        return self.source_file[0:self.source_file.rfind( "\\" )-1]

    def __str__(self):
        return ''.join([self.project, "\t", self.source_file, "\t", self.dummy1, "\t", self.resource_type, "\t" ,
            self.gid, "\t", self.lid, "\t", self.helpid, "\t", self.platform, "\t", self.dummy2, "\t" , self.langid,
            "\t", self.text, "\t", self.helptext, "\t", self.quickhelptext, "\t" , self.title, "\t", self.date ])

    def get_id(self):
        return ''.join([self.project, self.gid, self.lid, self.source_file, self.resource_type, self.platform, self.helpid, self.langid])
