import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.Principal;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.james.mime4j.field.datetime.DateTime;


public class AppBackupData implements DirData, Comparable<AppBackupData>
{
	private String _id;
	private int _numId;
	private File _dataDir;
	private Date dateTime;
	private String _title;
	
	public AppBackupData(File appBackupDir) throws Exception
	{
		File P12 = new File( appBackupDir, "Certificates.p12");//"CertificateSigningRequest.certSigningRequest");
		if( P12.exists() )
		{
			this.getInfo( P12 );
			this._numId = Integer.valueOf( appBackupDir.toPath().getFileName().toString() );
			this._dataDir = appBackupDir;
		}
	}
	
	public int getNumericId()
	{
		return this._numId;
	};
	
	public String getId()
	{
		return this._id;
	}
	
	public File getDataDir()
	{
		return this._dataDir;
	}

	/**
	 * Gets the com.sharefaith.churchapp.something id.
	 * @param P12
	 * @return String id or null
	 * @throws KeyStoreException
	 * @throws NoSuchAlgorithmException
	 * @throws CertificateException
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private void getInfo( File P12 ) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException
	{
		final String pw = ""; //no password
		//Basic p12 reader http://stackoverflow.com/questions/16970302
		KeyStore p12 = KeyStore.getInstance("pkcs12");
		p12.load(new FileInputStream(P12), pw.toCharArray());
		Enumeration e = p12.aliases();
        while (e.hasMoreElements())
        {
            String alias = (String) e.nextElement();
            X509Certificate c = (X509Certificate) p12.getCertificate(alias);
            Principal subject = c.getSubjectDN();
            //System.out.println("Expires: " + c.getNotAfter());
            this.dateTime = c.getNotAfter();
            String subjectArray[] = subject.toString().split(",");
            for (String s : subjectArray)
            {
                String[] str = s.trim().split("=");
                String key = str[0];
                String value = str[1];
                //System.out.println(key + " - " + value);
                if( key.equals("UID") ) this._id = value;
            }
        }
	}
	
	public String toString()
	{
		return String.valueOf(this._numId) + " ==> " + this._id + " expires " + this.dateTime;
	}
	
	public Date getDateTime()
	{
		return this.dateTime;
	}
	
	@Override
	public int compareTo(AppBackupData o)
	{
		 return this.getDateTime().compareTo(o.getDateTime());
	}

	@Override
	public String getTitle()
	{
		return this._title;
	}
}
