import { Chart } from './core';
import { isDefined } from './util';

Chart.prototype.zoom = function (domain) {
    var $$ = this.internal;
    if (domain) {
        if ($$.isTimeSeries()) {
            domain = domain.map(function (x) { return $$.parseDate(x); });
        }
        if ($$.config.subchart_show) {
            $$.brush.selectionAsValue(domain, true);
        }
        else {
            $$.updateXDomain(null, true, false, false, domain);
            $$.redraw({withY: $$.config.zoom_rescale, withSubchart: false});
        }
        $$.config.zoom_onzoom.call(this, $$.x.orgDomain());
        return domain;
    } else {
        return $$.x.domain();
    }
};
Chart.prototype.zoom.enable = function (enabled) {
    var $$ = this.internal;
    $$.config.zoom_enabled = enabled;
    $$.updateAndRedraw();
};
Chart.prototype.unzoom = function () {
    var $$ = this.internal;
    if ($$.config.subchart_show) {
        $$.brush.clear();
    }
    else {
        $$.updateXDomain(null, true, false, false, $$.subX.domain());
        $$.redraw({withY: $$.config.zoom_rescale, withSubchart: false});
    }
};

Chart.prototype.zoom.max = function (max) {
    var $$ = this.internal, config = $$.config, d3 = $$.d3;
    if (max === 0 || max) {
        config.zoom_x_max = d3.max([$$.orgXDomain[1], max]);
    }
    else {
        return config.zoom_x_max;
    }
};

Chart.prototype.zoom.min = function (min) {
    var $$ = this.internal, config = $$.config, d3 = $$.d3;
    if (min === 0 || min) {
        config.zoom_x_min = d3.min([$$.orgXDomain[0], min]);
    }
    else {
        return config.zoom_x_min;
    }
};

Chart.prototype.zoom.range = function (range) {
    if (arguments.length) {
        if (isDefined(range.max)) { this.domain.max(range.max); }
        if (isDefined(range.min)) { this.domain.min(range.min); }
    } else {
        return {
            max: this.domain.max(),
            min: this.domain.min()
        };
    }
};
