// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import { $ } from 'chrome://resources/js/util.js';
import { BrowserBridge } from './browser_bridge.js';
import { addNode } from './util.js';
import { DivView } from './view.js';
/** @type {?DnsView} */
let instance = null;
/**
 * This view displays information on the host resolver:
 *   - Has a button to lookup the host.
 *   - Has a button to clear the host cache.
 */
export class DnsView extends DivView {
    constructor() {
        super(DnsView.MAIN_BOX_ID);
        this.browserBridge_ = BrowserBridge.getInstance();
        this.dnsLookUpInput_ = $(DnsView.DNS_LOOKUP_INPUT_ID);
        this.dnsLookUpOutputDiv_ = $(DnsView.DNS_LOOKUP_OUTPUT_ID);
        $(DnsView.DNS_LOOKUP_FORM_ID)
            .addEventListener('submit', this.onSubmitResolveHost_.bind(this), false);
        $(DnsView.CLEAR_CACHE_BUTTON_ID).onclick = () => {
            this.browserBridge_.sendClearHostResolverCache();
        };
    }
    onSubmitResolveHost_(event) {
        const hostname = this.dnsLookUpInput_.value;
        if (hostname === '') {
            return;
        }
        this.dnsLookUpOutputDiv_.innerHTML = trustedTypes.emptyHTML;
        const span = addNode(this.dnsLookUpOutputDiv_, 'span');
        this.browserBridge_.sendResolveHost(this.dnsLookUpInput_.value)
            .then(result => {
            const resolvedAddresses = JSON.stringify(result.resolved_addresses);
            const div = addNode(span, 'div');
            div.textContent =
                `Resolved IP addresses of "${hostname}": ${resolvedAddresses}.`;
            div.style.fontWeight = 'bold';
            if (result.alternative_endpoints.length > 0) {
                result.alternative_endpoints.forEach((endpoint) => {
                    const json = JSON.stringify(endpoint);
                    const div = addNode(span, 'div');
                    div.textContent = `Alternative endpoint: ${json}.`;
                    div.style.fontWeight = 'bold';
                });
            }
            else {
                const div = addNode(span, 'div');
                div.textContent = `No alternative endpoints.`;
                div.style.fontWeight = 'bold';
            }
        })
            .catch(error => {
            const div = addNode(span, 'div');
            div.textContent =
                `An error occurred while resolving "${hostname}" (${error}).`;
            div.style.color = 'red';
            div.style.fontWeight = 'bold';
        });
        this.dnsLookUpInput_.value = '';
        event.preventDefault();
    }
    static getInstance() {
        return instance || (instance = new DnsView());
    }
}
DnsView.TAB_ID = 'tab-handle-dns';
DnsView.TAB_NAME = 'DNS';
DnsView.TAB_HASH = '#dns';
// IDs for special HTML elements in dns_view.html
DnsView.MAIN_BOX_ID = 'dns-view-tab-content';
DnsView.DNS_LOOKUP_FORM_ID = 'dns-view-dns-lookup-form';
DnsView.DNS_LOOKUP_INPUT_ID = 'dns-view-dns-lookup-input';
DnsView.DNS_LOOKUP_OUTPUT_ID = 'dns-view-dns-lookup-output';
DnsView.DNS_LOOKUP_SUBMIT_ID = 'dns-view-dns-lookup-submit';
DnsView.CLEAR_CACHE_BUTTON_ID = 'dns-view-clear-cache';
