/**
 * Invoice Ninja (https://invoiceninja.com)
 *
 * @link https://github.com/invoiceninja/invoiceninja source repository
 *
 * @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
 *
 * @license https://opensource.org/licenses/AAL
 */

import Axios from 'axios';

class Setup {
    constructor() {
        this.checkDbButton = document.getElementById('test-db-connection');
        this.checkDbAlert = document.getElementById('database-response');

        this.checkSmtpButton = document.getElementById('test-smtp-connection');
        this.checkSmtpAlert = document.getElementById('smtp-response');

        this.checkPdfButton = document.getElementById('test-pdf');
        this.checkPdfAlert = document.getElementById('test-pdf-response');
    }

    handleDatabaseCheck() {
        let data = {
            host: document.querySelector('input[name="host"]').value,
            database: document.querySelector('input[name="database"]').value,
            username: document.querySelector('input[name="db_username"]').value,
            password: document.querySelector('input[name="db_password"]').value,
        };

        Axios.post('/setup/check_db', data)
            .then((response) => this.handleSuccess(this.checkDbAlert))
            .catch((e) => this.handleFailure(this.checkDbAlert, e.response.data.message));
    }

    handleSmtpCheck() {
        let data = {
            driver: document.querySelector('select[name="mail_driver"]').value,
            from_name: document.querySelector('input[name="mail_name"]').value,
            from_address: document.querySelector('input[name="mail_address"]')
                .value,
            username: document.querySelector('input[name="mail_username"]')
                .value,
            host: document.querySelector('input[name="mail_host"]').value,
            port: document.querySelector('input[name="mail_port"]').value,
            encryption: document.querySelector('select[name="encryption"]')
                .value,
            password: document.querySelector('input[name="mail_password"]')
                .value,
        };

        Axios.post('/setup/check_mail', data)
            .then((response) => this.handleSuccess(this.checkSmtpAlert))
            .catch((e) => this.handleFailure(this.checkSmtpAlert));
    }

    handleTestPdfCheck() {
        Axios.post('/setup/check_pdf', {})
            .then((response) => {
                try {
                    let win = window.open(response.data.url, '_blank');
                    win.focus();

                    return this.handleSuccess(this.checkPdfAlert);
                } catch (error) {
                    this.handleSuccess(this.checkPdfAlert);
                    this.checkPdfAlert.textContent = `Success! You can preview test PDF here: ${response.data.url}`;
                }
            })
            .catch((error) => {
                console.log(error);
                this.handleFailure(this.checkPdfAlert)
            });
    }

    handleSuccess(element) {
        element.classList.remove('alert-failure');
        element.innerText = 'Success!';
        element.classList.add('alert-success');
    }

    handleFailure(element, message = null) {
        element.classList.remove('alert-success');
        element.innerText = message ? message : "Oops, looks like something isn't correct!";
        element.classList.add('alert-failure');
    }

    handle() {
        this.checkDbButton.addEventListener('click', () =>
            this.handleDatabaseCheck()
        );

        this.checkSmtpButton.addEventListener('click', () =>
            this.handleSmtpCheck()
        );

        this.checkPdfButton.addEventListener('click', () =>
            this.handleTestPdfCheck()
        );
    }
}

new Setup().handle();
