#!python
# coding: utf-8
"""
    cli.py
    ~~~~~~~~~~

"""
import os
import sys

import click
import requests

from namecom import Name


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


def get_namecom_client(name, token):
    if not name or not token:
        name = os.environ.get("NAMECOM_NAME", None)
        token = os.environ.get("NAMECOM_TOKEN", None)

    if not name or not token:
        click.echo("name or token are missing", err=True)
        sys.exit(1)

    return Name(name, token)


@cli.command()
@click.option("--domain", help="domain name like example.org")
@click.option("--host", help="host like www, www1")
@click.option("--dns_type", help="DNS record type, like A, cname")
@click.option("--answer", help="127.0.0.1, example.org, etc")
@click.option("--name", help="name for name.com", default="")
@click.option("--token", help="token for name.com", default="")
def create_dns(domain, host, dns_type, answer, name, token):
    client = get_namecom_client(name, token)
    existing_records = client.list_records_for_host(domain, host)

    if len(existing_records) == 1:
        record = existing_records[0]
        # keep existing record
        if record["type"] == dns_type and record["answer"] == answer:
            click.echo("We have found same record there, quit")
            return
        else:
            # update existing record
            click.echo("update existing record")
            client.update_record(domain, record["id"], host, dns_type, answer)
            return

    # delete existing records and create new
    for record in existing_records:
        client.delete_record(record["id"])
    data = client.create_record(domain, host, dns_type, answer)

    click.echo("Done {}".format(data))


@cli.command()
@click.option("--domain", help="domain name like example.org")
@click.option("--host", help="host like www, www1")
@click.option("--name", help="name for name.com", default="")
@click.option("--token", help="token for name.com", default="")
def delete_dns(domain, host, name, token):
    client = get_namecom_client(name, token)
    existing_records = client.list_records_for_host(domain, host)

    for record in existing_records:
        client.delete_record(domain, record["id"])


@cli.command()
@click.option("--domain", required=True, help="domain name like example.org")
@click.option("--host", required=True, help="host like www, www1")
@click.option("--name", required=True, help="username for name.com")
@click.option("--token", required=True, help="token for name.com")
def ddns(domain=None, host=None, name=None, token=None):
    """Set name.com dns record to public IP."""
    ip = requests.get('https://api.ipify.org').text
    client = get_namecom_client(name, token)

    click.echo("current IP: {}".format(ip))
    existing_records = client.list_records_for_host(domain, host)
    if len(existing_records) == 0:
        click.echo("record not found, creating new..")
        client.create_record(domain, host, "A", ip)
        click.echo("done")
    elif len(existing_records) >= 2:
        click.echo("found multipile records for {}.{}, quit".format(host, domain))
        sys.exit(1)
    else:
        record = existing_records[0]
        # keep existing record
        if record["type"] == "A" and record["answer"] == ip:
            click.echo("We have found the same record, quit")
        else:
            # update existing record
            click.echo("update existing record")
            name.update_record(domain, record["id"], host, "A", ip)
            click.echo("{}.{} => {} done".format(host, domain, ip))


if __name__ == "__main__":
    cli()
