#!/usr/bin/env python

import os
from flask import flash
from lxml import objectify

from _import import add_children, set_attr, normalize_tag, normalize_move, parse_samples, postprocess_move
from model import Move, Device
from model import db


def parse_move(tree):
    device_log = tree.DeviceLog
    move = Move()

    add_children(move, device_log.Header)

    for child in device_log.Device.Info.iterchildren():
        tag = normalize_tag(child.tag)
        attr = "device_info_%s" % tag.lower()
        set_attr(move, attr, child.text)

    normalize_move(move)
    return move


def parse_device(tree):
    device = Device()
    device.name = tree.DeviceLog.Device.Name.text
    device.serial_number = tree.DeviceLog.Device.SerialNumber.text
    return device


def sml_import(xmlfile, user, request_form):
    filename = xmlfile.name
    tree = objectify.parse(xmlfile).getroot()
    move = parse_move(tree)
    move.source = os.path.abspath(filename)
    move.import_module = __name__
    device = parse_device(tree)
    persistent_device = Device.query.filter_by(serial_number=device.serial_number).scalar()
    if persistent_device:
        if not persistent_device.name:
            flash("update device name to '%s'" % device.name)
            persistent_device.name = device.name
        else:
            assert device.name == persistent_device.name
        device = persistent_device
    else:
        db.session.add(device)

    if Move.query.filter_by(user=user, date_time=move.date_time, device=device).scalar():
        flash("%s at %s already exists" % (move.activity, move.date_time), 'warning')
    else:
        move.user = user
        move.device = device
        db.session.add(move)

        samples = tree.DeviceLog.Samples.iterchildren()
        for sample in parse_samples(samples, move):
            db.session.add(sample)

        postprocess_move(move)

        db.session.commit()
        return move