package tarau.jinni;
import java.io.Reader;import java.io.IOException;

/**
  Builds Jinni Fluents from Java
  Streams
*/
class ClauseReader extends CharReader {
  protected Parser parser;
    ClauseReader(Reader reader,Prog p) {
    super(reader,p);
    make_parser("from shared reader");
  }  
  ClauseReader(String f,Prog p) {
    super(f,p);
    make_parser(f);
  }
  
  ClauseReader(Prog p) {
    super(p);
    make_parser("standard input");
  }
  
  /**
   * parses from a string representation of a term
   */
  ClauseReader(Term t,Prog p) {
    super(t,p);
    make_parser("string parser");
  }
  
  void make_parser(String f) {
    if(null!=reader)
      try {
           this.parser=new Parser(reader);
        }
      catch(IOException e) {
        IO.errmes("unable to build parser for: " +f);
      }
    else
      this.parser=null;
  }
  
  public Term getElement() {
    Clause C=null;
    if(//IO.peer!=null &&        reader.equals(IO.input)) {       String s=IO.promptln(">:");       if(null==s||0==s.length()) C=null;
       else C=new Clause(s);    }
    else if(null!=parser) {
      if(parser.atEOF()) {
        C=null;
        stop();
      }
      else
        C=parser.readClause();
      if(C!=null && C.getHead().eq(Const.anEof)) {
        C=null;
        stop();
      }
    }
    return extract_info(C);
  }
  
  static Fun extract_info(Clause C) {
    if(null==C) return null;
    Term Vs=C.varsOf();
    Clause SuperC=new Clause(Vs,C);
    SuperC.dict=C.dict;
    Clause NamedSuperC=SuperC.cnumbervars(false);
    Term Ns=NamedSuperC.getHead();
    Term NamedC=NamedSuperC.getBody();
    return new Fun("clause",C,Vs,NamedC,Ns);
  }
  
  public void stop() {
    super.stop();
    parser=null;
  }
}
