% SETDEFAULTOPTION Sets the default option of the a param object.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% DESCRIPTION: SETDEFAULTOPTION Sets the default option of the a param
%              object. If the option doesn't exist in the options of the
%              param object then this method throws an error.
%
% CALL:        obj = obj.setDefaultOption(option);
%
% INPUTS:      obj    - A single param object
%              option - An option which should to be set.
%
% VERSION:     $Id: setDefaultOption.m,v 1.7 2011/04/22 21:14:57 mauro Exp $
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function p = setDefaultOption(p, option)
  
  % Check input
  if numel(p) ~= 1
    error('### This method works only with one input parameter object.');
  end
  if ~ischar(option) && isa(option, 'paramValue') && numel(option) ~= 1
    error('### This method works only with one input option.');
  end
  
  if ~isa(p.val, 'paramValue')
    p.val = option;
    return;
  end
  
  % Make a copy if the user doesn't use the modifier command
  p = copy(p, nargout);
  
  found = false;
  for ii = 1:numel(p.val.options)
    
    % Use different compare methods for the different types of 'option'
    switch class(option)
      case 'char'

        % CHAR
        if strcmpi(p.val.options{ii}, option)
          p.val.setValIndex(ii);
          found = true;
          break;
        end
      
      case 'specwin'
        
        % SPECWIN
        if strcmpi(p.val.options{ii}, option.type)
          p.val.setValIndex(ii);
          found = true;
          break;
        end
        
      case 'paramValue'
        if isequal(p.val.options{ii}, option.options{option.valIndex})
          p.val.setValIndex(ii);
          found = true;
          break;
        end
        
      otherwise
        
        % ALL OTHER TYPES
        if isequal(p.val.options{ii}, option)
          p.val.setValIndex(ii);
          found = true;
          break;
        end
        
    end
  end
  
  if ~found
    % IF the selection mode of the param-object is OPTIONAL then append
    % this new option to the param.options
    if (p.val.selection == paramValue.OPTIONAL)
      newOptions = [reshape(p.val.options, [], 1); {option}];
      p.val.setValIndexAndOptions(numel(newOptions), newOptions);
    else
      % throw an error if the option is not found in the param-options
      error('### I couldn''t find the option [%s] in the param-options.', utils.helper.val2str(option));
    end
  end
  
end

