"""empty message

Revision ID: bf600ca861a4
Revises: 68a5c025ab8e
Create Date: 2020-12-15 15:58:41.545563

"""
from alembic import context
from alembic import op
import sqlalchemy as sa
import sqlalchemy_utils
import citext
import teal


# revision identifiers, used by Alembic.
revision = 'bf600ca861a4'
down_revision = '68a5c025ab8e'
branch_labels = None
depends_on = None


def get_inv():
    INV = context.get_x_argument(as_dictionary=True).get('inventory')
    if not INV:
        raise ValueError("Inventory value is not specified")
    return INV

def upgrade():
    con = op.get_bind()
    sql = f"""
    select d.id, d.hid, dd.serial_number from {get_inv()}.computer as c 
        join {get_inv()}.device as d on c.id=d.id 
        inner join {get_inv()}.component as cmp on cmp.parent_id=c.id 
        inner join {get_inv()}.network_adapter as net on net.id=cmp.id 
        join {get_inv()}.device as dd on net.id=dd.id;
    """
    computers = con.execute(sql)
    hids = {}
    macs = {}
    for c in computers:
        hids[c.id] = c.hid
        if not c.serial_number:
            continue
        try:
            macs[c.id].append(c.serial_number)
            macs[c.id].sort()
        except:
            macs[c.id] = [c.serial_number]

    for id_dev, hid in hids.items():
        if not (id_dev and hid):
            continue
        if not id_dev in macs:
            continue
        mac = macs[id_dev][0]
        new_hid = "{}-{}".format(hid, mac)

        sql = f"update {get_inv()}.device set hid='{new_hid}' where id={id_dev};"
        con.execute(sql)



def downgrade():
    pass