package haipham.webnntp.ejb.message;

import java.util.*;
import javax.ejb.*;
import haipham.webnntp.ejb.folder.Folder;

/** Message Model for the MessageEJB. Searchable headers are put in separate
 *  fields. Other headers are put into a Hashtable. Currently support plain 
 *  body only. Attachment may be supported in the near future
 */ 

public class MessageModel{
    public String   subject;
    public String   from;
    public String   plainBody;
    public String   messageId;
    public String   references;
    public int      status;
    public Date     date;
    public Hashtable additionalHeaders;
    public Folder   folder;

    protected EntityContext   m_context;

    public Folder getFolder(){return folder;}

    public void setFolder(Folder folder){this.folder = folder;}

    public int getStatus(){return status;}

    public void setStatus(int s){status = s;}

    public String getSubject(){        
        return getHeader("Subject");
    }

    public void setSubject(String s){subject = s;}

    public String getFrom(){
        return getHeader("From");
    }

    public void setFrom(String f){from = f;}

    public Date getDate(){return date;}

    public void setDate(Date d){date = d;}    

    public String getMessageId(){return messageId;}

    public void setMessageId(String id){messageId = id;}

    public String getPlainBody(){return plainBody;}

    /** Set the body of the message
     *  @param body the message body
     */
    public void setPlainBody(String body){plainBody = body;}

    public String getReferences(){return references;}

    /** Set the message's reference
     *  @param s references encompass in <...>
     */
    public void setReferences(String temp){references = temp;}

    /** Get the value assosicate with a key. Case insensitive.
     */
    public String getHeader(String key){
        key = key.toLowerCase();

        if ( key.equals("subject") ){
            return subject;
        }else if ( key.equals("from") ){
            return from;
        }else if ( key.equals("messageid") ){
            return messageId;
        }else if ( key.equals("references") ){
            return references;
        }else{
            return (String) additionalHeaders.get(key);
        }
    }

    /** Add a new pair of values. The key is converter to lowercase internally
     *  Currently doesn't support multi value on one key
     */
    /*
    public void addHeader(String key, String value){
        if ( value == null ){
            value = "";
        }
        additionalHeaders.put(key.toLowerCase(), value);
    }
    */
    
    /** Add a new key. The key is converted to lowercase internally.
     */
    public void setHeader(String key, String value){    
        key = key.toLowerCase();

        if ( key.equals("subject") ){
            subject = value;
        }else if ( key.equals("from") ){
            from = value;
        }else if ( key.equals("messageId") ){
            messageId = value;
        }else if ( key.equals("references") ){
            references = value;
        }else{
            additionalHeaders.put(key, value);   
        }
    }

    public Enumeration getHeaderKeys(){return additionalHeaders.keys();}

    /*
    public String getRFC822FormattedMessage(){
        StringBuffer buffer =  new StringBuffer(getBody().length());
    
        Enumeration keys = getHeaderKeys();
        Object      key;
    
        while ( keys.hasMoreElements() ){
            key = keys.nextElement();
        
            buffer.append(key.toString());
            buffer.append(": ");
            buffer.append(getHeader((String) key));
            buffer.append("\r\n");
        }
        buffer.append("\r\n");
        buffer.append(getBody());
    
        return buffer.toString();
    }    
    */
}
