package com.googlecode.prolog_cafe.exceptions;

import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
import com.googlecode.prolog_cafe.lang.Operation;
import com.googlecode.prolog_cafe.lang.StructureTerm;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;

/**
 * Domain error.<br>
 * There will be a domain error when the type of an argument
 * is correct, but the value is outside the domain for which
 * the procedure is defined.
 *
 * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
 * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
 * @version 1.0
 */
public class IllegalDomainException extends BuiltinException {
    private static final long serialVersionUID = 1L;

    /** A functor symbol of <code>domain_error/4</code>. */
    public static final SymbolTerm DOMAIN_ERROR = SymbolTerm.intern("domain_error", 4);

    /*
      domain ::= character_code_list | close_option | flag_value | io_mode | 
                 non_empty_list | not_less_than_zero | operator_priority |
		 operator_specifier | prolog_flag | read_option | source_sink |
		 stream | steam_option | stream_or_alias | stream_position |
		 stream_property | write_option |
		 hash_or_alias| hash_option | 'arithmetic expression'
    */
    /** Holds a string representation of valid domain. */
    public String domain;

    /** Holds the argument or one of its components which caused the error. */
    public Term culprit;

    /** Constructs a new <code>IllegalDomainException</code>
     * with a valid domain and its culprit. */
    public IllegalDomainException(String _domain, Term _culprit) {
	domain    = _domain;
	culprit = _culprit;
    }

    /** Constructs a new <code>IllegalDomainException</code> 
     * with the given arguments. */
    public IllegalDomainException(Operation _goal, int _argNo, String _domain, Term _culprit) {
	this.goal    = _goal;
	this.argNo   = _argNo;
	domain    = _domain;
	culprit = _culprit;
    }

    /** Returns a term representation of this <code>IllegalDomainException</code>:
     * <code>domain_error(goal,argNo,type,culprit)</code>.
     */
    @Override
    public Term getMessageTerm() {
	Term[] args = {
	    new JavaObjectTerm(goal), 
	    new IntegerTerm(argNo), 
	    SymbolTerm.create(domain),
	    culprit};
	return new StructureTerm(DOMAIN_ERROR, args);
    }

    /** Returns a string representation of this <code>IllegalDomainException</code>. */
    @Override
    public String toString() {
	String s = "{DOMAIN ERROR: " + goal.toString();
	if (argNo > 0)
	    s += " - arg " + argNo;
	s += ": expected " + domain;
	s += ", found " + culprit.toString();
	s += "}";
	return s;
    }
}
