"""
Command line tool to communicate with
the NetBox API
"""
import click
import pandas as pd

from gso.services import netbox_client as nc

# Define url and token for netbox API
# TODO move to config file
token = "<Token>"
api = 'http://127.0.0.1:8001'
nbclient = nc.connect(api, token)


def convert_to_table(data, fields):
    df = pd.DataFrame(data)
    df = df[fields]  # Selecting specific fields to display
    return df


@click.group()
def cli():
    pass


@cli.group()
def create():
    pass


@create.command()
@click.option('--fqdn', prompt='Enter device name', help='Device name')
@click.option('--model', default="vmx", help='Device model')
@click.option('--role', default="router", help='Device role')
@click.option('--site', default="Amsterdam", help='Device role')
def device(fqdn: str, model: str, role: str, site: str):
    click.echo(f"Creating device: fqdn={fqdn}, model={model}, role={role}")
    new_device = nc.create_device(nbclient, fqdn, model, role, site)
    print(new_device)


@create.command()
@click.option('--name', help='Interfacename')
@click.option('--type', default='10gbase-t', help='Interface type, default is 10GBASE-T')
@click.option('--fqdn', help='Device where to create interface')
def interface(name: str, type: str, fqdn: str):
    click.echo(f"Creating interface: name={name}, type={type}, fqdn={fqdn}")
    new_interface = nc.create_interface(nbclient, name, type, fqdn)
    print(new_interface)


@create.command()
@click.option('--name', help='Manufacturer name')
@click.option('--slug', help='Short name for manufacturer')
def manufacturer(name: str, slug: str):
    click.echo(f"Creating manufacturer: name={name}")
    manufacturer = nc.create_manufacturer(nbclient, name, slug)
    print(manufacturer)


@create.command()
@click.option('--manufacturer', help='Manufacturer for device')
@click.option('--model', help='Model for device')
@click.option('--slug', help='Short name for manufacturer')
def device_type(manufacturer: str, model: str, slug: str):
    click.echo(f"Creating device type: manufacturer={manufacturer} model = {model}")
    device_type = nc.create_device_type(nbclient, manufacturer, model, slug)
    print(device_type)


@create.command()
@click.option('--name', help='Name for device role')
@click.option('--slug', help='Short name for device role')
def device_role(name: str, slug: str):
    click.echo(f"Creating device role: name={name}")
    device_role = nc.create_device_role(nbclient, name, slug)
    print(device_role)


@create.command()
@click.option('--name', help='Name for device site')
@click.option('--slug', help='Short name for device site')
def device_site(name: str, slug: str):
    click.echo(f"Creating device site: name={name}")
    device_site = nc.create_device_site(nbclient, name, slug)
    print(device_site)


create.add_command(device)
create.add_command(interface)
create.add_command(manufacturer)
create.add_command(device_type)
create.add_command(device_role)
create.add_command(device_site)


# Define list commands here
@cli.group()
def list():
    pass


@list.command()
@click.option('--fqdn', help='Device name to list interfaces')
@click.option('--type', default="10gbase-t", help='Interface type to list interfaces')
def interfaces(fqdn: str, type: str):
    click.echo(f"Listing all interfaces for: device with fqdn={fqdn}, type={type}")
    interface_list = nc.get_interfaces_by_device(nbclient, fqdn)
    display_fields = ["name", "enabled", "type", "parent", "lag", "speed"]
    iface_list = []
    for iface in interface_list:
        iface_list.append(dict(iface))

    table = convert_to_table(iface_list, display_fields)
    print(table)


@list.command()
def devices():
    click.echo("Listing all devices:")
    device_list = nc.get_all_devices(nbclient)
    display_fields = ["name", "device_type"]
    devices = []
    for device in device_list:
        devices.append(dict(device))

    table = convert_to_table(devices, display_fields)
    print(table)


list.add_command(interfaces)
list.add_command(devices)


# Define here attach command
@cli.group()
def attach():
    pass


@attach.command()
@click.option('--fqdn', help='Device name where to attach interface to lag')
@click.option('--iface', help='Interface name to attach to lag')
@click.option('--lag', help='LAG name to attach interface')
def interface(fqdn: str, iface: str, lag: str):
    click.echo(f"Attaching interface to lag: device ={fqdn}, interface name={iface} to lag={lag}")
    new_iface = nc.attach_interface_to_lag(nbclient, fqdn, lag, iface)
    print(new_iface)


attach.add_command(interface)


if __name__ == '__main__':
    cli()