/* © 2016 ACSONE SA/NV (<http://acsone.eu>)
 * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
odoo.define('date_range.search_filters', function (require) {
"use strict";

var core = require('web.core'); 
var data = require('web.data');
var filters = require('web.search_filters');
var Model = require('web.Model');
var framework = require('web.framework');

var _t = core._t;
var _lt = core._lt;
filters.ExtendedSearchProposition.include({
    select_field: function(field) {
        this._super.apply(this, arguments);
        this.is_date_range_selected = false;
        this.is_date = field.type == 'date' || field.type == 'datetime';
        this.$value = this.$el.find('.searchview_extended_prop_value, .o_searchview_extended_prop_value');
        if (this.is_date){
            var ds = new data.DataSetSearch(this, 'date.range.type', this.context, [[1, '=', 1]]);
            ds.read_slice(['name'], {}).done(this.proxy('add_date_range_types_operator'));
        }
    },
    
    add_date_range_types_operator: function(date_range_types){
        var self = this;
        _.each(date_range_types, function(drt) {
            $('<option>', {value: 'drt_' + drt.id})
                .text(_('in ') + drt.name)
                .appendTo(self.$el.find('.searchview_extended_prop_op, .o_searchview_extended_prop_op'));
        });
    },
    
    operator_changed: function (e) {
        var val = $(e.target).val();
        this.is_date_range_selected = val.startsWith('drt_'); 
        if (this.is_date_range_selected){
            var type_id = val.replace('drt_', '');
            this.date_range_type_operator_selected(type_id);
            return;
        }
        this._super.apply(this, arguments);
    },

    date_range_type_operator_selected: function(type_id){
        this.$value.empty().show();
        var ds = new data.DataSetSearch(this, 'date.range', this.context, [['type_id', '=', parseInt(type_id)]]);
        ds.read_slice(['name','date_start', 'date_end'], {}).done(this.proxy('on_range_type_selected'));
            
    },
    
    on_range_type_selected: function(date_range_values){
        this.value = new filters.ExtendedSearchProposition.DateRange(this, this.value.field, date_range_values);
        this.value.appendTo(this.$value);
        if (!this.$el.hasClass('o_filter_condition')){
            this.$value.find('.date-range-select').addClass('form-control');   
        }
        this.value.on_range_selected();
    },
    
    get_filter: function () {
        var res = this._super.apply(this, arguments);
        if (this.is_date_range_selected){
            // in case of date.range, the domain is provided by the server and we don't
            // want to put nest the returned value into an array.
            res.attrs.domain = this.value.domain;
        }
        return res;
    },
    
});

filters.ExtendedSearchProposition.DateRange = filters.ExtendedSearchProposition.Field.extend({
    template: 'SearchView.extended_search.dateRange.selection',
    events: {
        'change': 'on_range_selected',
    },
    
    init: function (parent, field, date_range_values) {
        this._super(parent, field);
        this.date_range_values = date_range_values;
    },

    toString: function () {
        var select = this.$el[0];
        var option = select.options[select.selectedIndex];
        return option.label || option.text;
    },
    
    get_value: function() {
        return parseInt(this.$el.val());
    },
    
    on_range_selected: function(e){
        var self = this;
        self.domain = '';
        framework.blockUI();
        new Model("date.range")
                .call("get_domain",  [
                [this.get_value()],
                 this.field.name,
                 {}
         ])
        .then(function (domain) {
            framework.unblockUI();
            self.domain = domain;
        });
    },
    
    get_domain: function (field, operator) {
        return this.domain;
    },

});

});