import CloudFlare
import zones
import dns_records as dns
import socket
import os
import json
import sys

PROJECT_ROOT = os.path.abspath(os.path.join(
    os.path.dirname(__file__),
    os.pardir)
)
sys.path.append(PROJECT_ROOT)

from emails.email_utils import get_dkim


# get absolute paths
source = os.path.dirname(__file__)
parent = os.path.abspath(source + '/../')

# load vars file
vars_file = open(parent + '/email_server_vars.json')
dns_vars = json.load(vars_file)
vars_file.close()


domain = dns_vars['server_info']['domain']
token = dns_vars['dns_info']['cloudflare_api_key']
mail_server = dns_vars['server_info']['mail_server']
dkim_key = get_dkim.get_dkim()

mail_server_ip = socket.gethostbyname(mail_server)

cf = CloudFlare.CloudFlare(token=token)
zone_id = zones.get_zone_id(cf, domain)


def generate_dns_records() -> list:
    record_list = []
    server_hostname = ("mail." + domain)
    # standard mail records
    record_list.append(dns.DnsRecord(name=server_hostname, record_type='A', content=mail_server_ip))
    record_list.append(dns.DnsRecord(name='autodiscover', record_type='CNAME', content=server_hostname))
    record_list.append(dns.DnsRecord(name='autoconfig', record_type='CNAME', content=server_hostname))
    record_list.append(dns.MxRecord(name=domain, priority=10, content=server_hostname))

    # email service records
    srv_dict = {'proto': '_tcp', 'name': server_hostname, 'priority': 0, 'weight': 1, 'target': server_hostname}
    mail_imap_srv_data = dns.SrvData(service='_imap', port=143, **srv_dict)
    record_list.append(dns.SrvRecord(mail_imap_srv_data))

    mail_imaps_srv_data = dns.SrvData(service='_imaps', port=993, **srv_dict)
    record_list.append(dns.SrvRecord(mail_imaps_srv_data))

    mail_pop3_srv_data = dns.SrvData(service='_pop3', port=110, **srv_dict)
    record_list.append(dns.SrvRecord(mail_pop3_srv_data))

    mail_pop3s_srv_data = dns.SrvData(service='_pop3s', port=995, **srv_dict)
    record_list.append(dns.SrvRecord(mail_pop3s_srv_data))

    mail_sieve_srv_data = dns.SrvData(service='_sieve', port=4190, **srv_dict)
    record_list.append(dns.SrvRecord(mail_sieve_srv_data))

    mail_smtps_srv_data = dns.SrvData(service='_smtps', port=465, **srv_dict)
    record_list.append(dns.SrvRecord(mail_smtps_srv_data))

    mail_submission_srv_data = dns.SrvData(service='_submission', port=587, **srv_dict)
    record_list.append(dns.SrvRecord(mail_submission_srv_data))

    mail_autodiscover_srv_data = dns.SrvData(service='_autodiscover', port=443, **srv_dict)
    record_list.append(dns.SrvRecord(mail_autodiscover_srv_data))

    mail_carddavs_srv_data = dns.SrvData(service='_carddavs', port=443, **srv_dict)
    record_list.append(dns.SrvRecord(mail_carddavs_srv_data))

    mail_caldavs_srv_data = dns.SrvData(service='_caldavs', port=443, **srv_dict)
    record_list.append(dns.SrvRecord(mail_caldavs_srv_data))

    # txt records
    record_list.append(dns.DnsRecord(name='_caldavs._tcp', record_type='TXT', content='path=/SOGo/dav/'))
    record_list.append(dns.DnsRecord(name='_carddavs._tcp', record_type='TXT', content='path=/SOGo/dav/'))
    # spf
    record_list.append(
        dns.DnsRecord(name=domain, record_type='TXT', content='v=spf1 a mx ip4:' + mail_server_ip + ' ~all'))
    # dmarc
    record_list.append(dns.DnsRecord(name='_dmarc', record_type='TXT',
                                     content='v=DMARC1;p=quarantine;rua=mailto:mailauth-reports@' + server_hostname))
    # dkim
    record_list.append(
        dns.DnsRecord(name='dkim._domainkey', record_type='TXT', content='v=DKIM1;k=rsa;t=s;s=email;p=' + dkim_key))

    return record_list


def create_dns_records():
    records = generate_dns_records()
    dns.post_dns_records(cf, zone_id, records)
    exit(0)


def main():
    create_dns_records()


if __name__ == "__main__":
    main()
