/**
 * Created by carlcolt on 8/1/2017.
 */
var Va = Va || {};
Va.Crm = Va.Crm || {};
Va.Crm.Actions = Va.Crm.Actions || {};

Va.Crm.Actions.PersonSearch = function ($) {
    var _defaultErrorMessage = "An error occurred performing the search.";
    var _defaultTimeoutMessage = "The search timed out.  Please try again.";
    var _defaultDataIssueMessage = "There was issue with the search criteria.  Please enter more information and try again.";

    var _defaultSearchCriteria ={
        IsAttended:false,
        FirstName:"",
        MiddleName:"",
        LastName:"",
        PhoneNumber:"",
        BirthDate:"",
        SSID:"",
        Edipi:"",
        ICN:"",
        PatientSearchIdentifier: ""
    }

    var _searchCriteria = $.extend(true, {}, _defaultSearchCriteria);

    var dfd = $.Deferred();

    var find = function(criteria) {
        var failure = function(context) {
            dfd.rejectWith({type:"Fatal", message:"There was a fatal error executing the search."});
            return;
        };
        var success = function(result) {
            if (!result) {
                dfd.rejectWith({type:"Fatal", message: "There was a fatal error executing the search, no response was returned."});
                return;
            }

            var message = result.ResponseMessage;
            var validMessage = (message!==null && message!=="");

            if (result.Exception) {
                if (!validMessage) message = _defaultErrorMessage;
                dfd.rejectWith({type:"Exception", message:message})
                return;
            }
            if (result.Timeout) {
                if (!validMessage) message = _defaultTimeoutMessage;
                dfd.rejectWith({type:"Timeout", message:message})
                return;
            }
            if (result.DataIssue) {
                if (!validMessage) message = _defaultDataIssueMessage;
                dfd.rejectWith({type:"DataIssue", message:message})
                return;
            }

            // No errors
            dfd.resolveWith(result);
        };

        _searchCriteria = $.extend(true, {}, _defaultSearchCriteria, criteria);
        Va.Crm.Scripts.Process.ExecuteAction("btsss_PersonSearch", _searchCriteria)
            .fail(failure)
            .done(success);

        return dfd.promise();
    }

    return {
        get SearchCriteria() { return _searchCriteria},
        set SearchCriteria(criteria) { _searchCriteria = $.extend(true, {}, _defaultSearchCriteria, criteria); },
        Find: find
    };
}(jQuery);