import copy
import sys

from flask import g

from ereuse_devicehub.db import db
from ereuse_devicehub.devicehub import Devicehub
from ereuse_devicehub.resources.device.models import DataStorage, Placeholder
from ereuse_devicehub.resources.lot.models import LotDevice


def clone_device(device):
    if device.phid():
        return

    g.user = device.owner

    old_devicehub_id = device.devicehub_id

    dict_device = copy.copy(device.__dict__)
    dict_device.pop('_sa_instance_state')
    dict_device.pop('id', None)
    dict_device.pop('devicehub_id', None)
    dict_device.pop('actions_multiple', None)
    dict_device.pop('actions_one', None)
    dict_device.pop('components', None)
    dict_device.pop('tags', None)
    dict_device.pop('system_uuid', None)
    new_device = device.__class__(**dict_device)
    new_device.devicehub_id = old_devicehub_id
    device.devicehub_id = None
    new_device.owner = device.owner
    if device.parent and device.parent.binding:
        new_device.parent = device.parent.binding.device

    db.session.add(new_device)

    placeholder = Placeholder(
        device=new_device, binding=device, is_abstract=True, owner_id=device.owner_id
    )
    db.session.add(placeholder)

    tags = [x for x in device.tags]
    for tag in tags:
        tag.device = new_device

    lots = [x for x in device.lots]
    for lot in lots:
        for rel_lot in LotDevice.query.filter_by(lot_id=lot.id, device=device):
            rel_lot.device = new_device
    return new_device


def main():
    schema = sys.argv[1]
    app = Devicehub(inventory=schema)
    app.app_context().push()
    for device in DataStorage.query.all():
        if not device.phid():
            clone_device(device)

    db.session.commit()


if __name__ == '__main__':
    main()