#
#  SpanakopitaDocument.py
#  Spanakopita
#
#  Created by Nicholas Matsakis on 11/18/07.
#  Copyright __MyCompanyName__ 2007. All rights reserved.
#

from Foundation import *
from AppKit import *
import objc

from parser import GEDCOMParser, GEDCOMParseError
import errors

ERROR_DOMAIN = u"smallcultfollowing.Spankopita.ErrorDomain"

ERROR_PARSE_ERROR_CODE = 0

def flatten(list):
    res = []
    for item in list: res += item
    return res

class SpanakopitaDocument(NSDocument):
    def init(self):
        self = super(SpanakopitaDocument, self).init()
        self.setDatabase_(GEDCOMParser().parse([])) # start w/ empty db
        return self

    @objc.accessor
    def database(self):
        return self.a_database

    @objc.accessor
    def setDatabase_(self, db):
        self.a_database = db

    def windowNibName(self):
        return u"SpanakopitaDocument"
    
    def windowControllerDidLoadNib_(self, aController):
        super(SpanakopitaDocument, self).windowControllerDidLoadNib_(
            aController)

    def dataOfType_error_(self, typeName, outError):
        return None
    
    def readFromData_ofType_error_(self, data, typeName, outError):
        # Load the data as a string:
        string = NSString.alloc().initWithData_encoding_(
            data, NSUTF8StringEncoding) # make configurable

        # Split by every which kind of line:
        lines = [string]
        for divider in (u'\n\r', u'\r', u'\n'):
            lines = flatten([line.split(divider) for line in lines])

        # Parse the GEDCOM:
        try:
            NSLog(u"Parsing %d bytes / %d lines of gedcom" % (
                len(string), len(lines)))
            self.setDatabase_(GEDCOMParser().parse(lines))
            return True, None
        except GEDCOMParseError, e:
            NSLog(u"Parsing failed: %s" % (str(e),))
            return False, errors.parseErrorObject(e)
