package com.sensepost.yeti.dns;

import java.util.ArrayList;
import java.util.List;
import com.sensepost.yeti.common.NetworkTools;
import com.sensepost.yeti.results.ARecordResult;
import com.sensepost.yeti.results.SOARecordResult;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xbill.DNS.ARecord;
import org.xbill.DNS.CNAMERecord;
import org.xbill.DNS.Lookup;
import org.xbill.DNS.MXRecord;
import org.xbill.DNS.NSRecord;
import org.xbill.DNS.PTRRecord;
import org.xbill.DNS.Record;
import org.xbill.DNS.SOARecord;
import org.xbill.DNS.TXTRecord;
import org.xbill.DNS.TextParseException;
import org.xbill.DNS.Type;

/**
 *
 * @author willem
 */
public class DNS {

    public static SOARecordResult getSOARecord(String domainName) {
        SOARecordResult newDomain = null;
        try {
            Record[] recs = new Lookup(domainName, Type.SOA).run();
            if (recs != null) {
                domainName = ((SOARecord) recs[0]).getName().canonicalize().toString(true);
                newDomain = new SOARecordResult(domainName);
                newDomain.setNameServer(((SOARecord) recs[0]).getHost().toString(true));
                newDomain.setAdminName(((SOARecord) recs[0]).getAdmin().toString(true));
            }
        } catch (TextParseException tpe) {
            Logger.getLogger(DNS.class.getName()).log(Level.SEVERE, null, tpe);
        }
        return newDomain;
    }

    public static NSRecord getNSRecord(String domainName) {
        return null;
    }

    public static MXRecord getMXRecord(String domainName) {
        return null;
    }

    public static List<ARecordResult> getARecord(String hostName) throws TextParseException {
        List<ARecordResult> entries = null;

        Record[] recs = new Lookup(hostName, Type.A).run();
        if (recs != null) {
            if (recs.length > 0) {
                entries = new ArrayList<>();
                for (Record record : recs) {
                    ARecordResult foundSubDomain = new ARecordResult(NetworkTools.getDomainFromHost(hostName));
                    foundSubDomain.setHostName(hostName);
                    String ipAddress = ((ARecord) record).getAddress().getHostAddress();
                    foundSubDomain.setIpAddress(ipAddress);
                    foundSubDomain.setLookupType("A");
                    entries.add(foundSubDomain);
                }
            }
        }

        return entries;
    }

    public static PTRRecord getPTRRecord(String ipAddress) {
        return null;
    }

    public static CNAMERecord getCNAMERecord(String hostName) {
        return null;
    }

    public static TXTRecord getTXTRecord(String hostName) {
        return null;
    }
}