/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

define([
    'Magento_Ui/js/grid/columns/column',
    'mage/translate'
], function (Element, $t) {
    'use strict';

    return Element.extend({
        defaults: {
            bodyTmpl: 'Magento_Tax/price/adjustment',
            taxPriceType: 'final_price',
            taxPriceCssClass: 'price-including-tax',
            bothPrices: 3,
            inclTax: 2,
            exclTax: 1,
            modules: {
                price: '${ $.parentName }'
            },
            listens: {
                price: 'initializePriceAttributes'
            }
        },

        /**
         * {@inheritdoc}
         */
        initialize: function () {
            this._super()
                .initializePriceAttributes();

            return this;
        },

        /**
         * Update parent price.
         *
         * @returns {Object} Chainable.
         */
        initializePriceAttributes: function () {
            if (this.displayBothPrices && this.price()) {
                this.price().priceWrapperCssClasses = this.taxPriceCssClass;
                this.price().priceWrapperAttr = {
                    'data-label': $t('Incl. Tax')
                };
            }

            return this;
        },

        /**
         * Get price tax adjustment.
         *
         * @param {Object} row
         * @return {HTMLElement} tax html
         */
        getTax: function (row) {
            return row['price_info']['extension_attributes']['tax_adjustments']['formatted_prices'][this.taxPriceType];
        },

        /**
         * Set price tax type.
         *
         * @param {String} priceType
         * @return {Object}
         */
        setPriceType: function (priceType) {
            this.taxPriceType = priceType;

            return this;
        },

        /**
         * Return whether display setting is to display
         * both price including tax and price excluding tax.
         *
         * @return {Boolean}
         */
        displayBothPrices: function () {
            return +this.source.data.displayTaxes === this.bothPrices;
        },

        /**
         * Return whether display setting is to display price including tax.
         *
         * @return {Boolean}
         */
        displayPriceIncludeTax: function () {
            return +this.source.data.displayTaxes === this.inclTax;
        },

        /**
         * Return whether display setting is to display price excluding tax.
         *
         * @return {Boolean}
         */
        displayPriceExclTax: function () {
            return +this.source.data.displayTaxes === this.exclTax;
        }
    });
});
