/*
 * Created on Sep 02, 2005
 * 
 *  This file is part of susidns project, see http://susi.i2p/
 *  
 *  Copyright (C) 2005 <susi23@mail.i2p>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *  
 * $Revision: 1.3 $
 */

package i2p.susi.dns;

import java.io.ByteArrayInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import net.i2p.data.DataHelper;
import net.i2p.util.PortMapper;
import net.i2p.util.SecureFileOutputStream;

public class SubscriptionsBean extends BaseBean
{
	private String fileName, content;
	private static final String SUBS_FILE = "subscriptions.txt";
	// If you change this, change in Addressbook Daemon also
	private static final String DEFAULT_SUB = "http://i2p-projekt.i2p/hosts.txt";
	
	public String getFileName()
	{
		loadConfig();
		fileName = subsFile().toString();
		return fileName;
	}

	/**
	 * @since 0.9.13
	  */
	private File subsFile() {
		return new File(addressbookDir(), SUBS_FILE);
	}

	private void reloadSubs() {
		synchronized(SubscriptionsBean.class) {
			locked_reloadSubs();
		}
	}

	private void locked_reloadSubs()
	{
		File file = subsFile();
		if(file.isFile()) {
			StringBuilder buf = new StringBuilder();
			BufferedReader br = null;
			try {
				br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
				String line;
				while( ( line = br.readLine() ) != null ) {
					buf.append( line );
					buf.append( "\n" );
				}
				content = buf.toString();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				if (br != null)
					try { br.close(); } catch (IOException ioe) {}
			}
		} else {
			content = DEFAULT_SUB;
		}
	}
	
	private void save() {
		synchronized(SubscriptionsBean.class) {
			locked_save();
		}
	}

	private void locked_save()
	{
		File file = subsFile();
		try {
			// trim and sort
			List<String> urls = new ArrayList<String>();
                        InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8"));
                        String line;
                        while ((line = DataHelper.readLine(in)) != null) {
				line = line.trim();
                                if (line.length() > 0)
                                    urls.add(line);
			}
			Collections.sort(urls);
			PrintWriter out = new PrintWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8"));
			for (String url : urls) {
				out.println(url);
			}
			out.close();
                        if (out.checkError())
                            throw new IOException("Failed write to " + file);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String getMessages() {
		String message = "";
		if( action != null ) {
                        if (_context.getBooleanProperty(PROP_PW_ENABLE) ||
			    (serial != null && serial.equals(lastSerial))) {
				if (action.equals(_t("Save"))) {
					save();
				/*******
					String nonce = System.getProperty("addressbook.nonce");
					if (nonce != null) {	
						// Yes this is a hack.
						// No it doesn't work on a text-mode browser.
						// Fetching from the addressbook servlet
						// with the correct parameters will kick off a
						// config reload and fetch.
				*******/
					if (content != null && content.length() > 2 &&
					    _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) > 0) {
						message = _t("Subscriptions saved, updating addressbook from subscription sources now.");
						          // + "<img height=\"1\" width=\"1\" alt=\"\" " +
						          // "src=\"/addressbook/?wakeup=1&nonce=" + nonce + "\">";
						_context.namingService().requestUpdate(null);
					} else {
						message = _t("Subscriptions saved.");
					}
				} else if (action.equals(_t("Reload"))) {
					reloadSubs();
					message = _t("Subscriptions reloaded.");
				}
			}			
			else {
				message = _t("Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit.")
                                          + ' ' +
                                          _t("If the problem persists, verify that you have cookies enabled in your browser.");
			}
		}
		if( message.length() > 0 )
			message = "<p class=\"messages\">" + message + "</p>";
		return message;
	}

	public void setContent(String content) {
		// will come from form with \r\n line endings
		this.content = DataHelper.stripHTML(content);
	}

	public String getContent()
	{
		if( content != null )
			return content;
		
		reloadSubs();
		
		return content;
	}
}
