// --- BEGIN COPYRIGHT BLOCK ---
// 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; version 2 of the License.
//
// 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.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// (C) 2007 Red Hat, Inc.
// All rights reserved.
// --- END COPYRIGHT BLOCK ---
package com.netscape.admin.certsrv.config.install;

import com.netscape.admin.certsrv.*;
import com.netscape.admin.certsrv.wizard.*;
import com.netscape.certsrv.common.*;
import com.netscape.admin.certsrv.config.*;

/**
 * Certificate Extension for installation wizard.
 *
 * @author Christine Ho
 * @version $Revision$, $Date$
 * @see com.netscape.admin.certsrv.config.install
 */
class WICertExtensionPage extends WBaseCertExtensionPage implements
  IWizardPanel {
    protected String mHelpIndex;

    WICertExtensionPage(String panelName) {
        super(panelName);
        mPanelName = panelName;
        init();
    }

    public boolean isLastPage() {
        return false;
    }

    public boolean initializePanel(WizardInfo info) {
        setBorder(makeTitledBorder(mPanelName));
        return super.initializePanel(info);
    }

    public boolean concludePanel(WizardInfo info) {
        InstallWizardInfo wizardInfo = (InstallWizardInfo)info;

        boolean ready = false;

        String rawData = "";
        if (mMIMECheckBox.isSelected()) {
            //Check the extension if it is valid
            rawData = ConfigConstants.TASKID+"="+TaskId.TASK_CHECK_EXTENSION;
            rawData = rawData+ConfigConstants.OPTYPE+"="+OpDef.OP_MODIFY;
            rawData = rawData+ConfigConstants.PR_CERTIFICATE_EXTENSION+"="+
              mMIMEText.getText().trim();

            startProgressStatus();
            ready = send(rawData, wizardInfo);
            endProgressStatus();
            if (!ready) {
                String str = getErrorMessage();
                if (str.equals("")) {
                    String errorMsg = mResource.getString(
                      mPanelName+"_ERRORMSG");
                    setErrorMessage(errorMsg);
                } else
                    setErrorMessage(str);
            }
        } else
            ready = true;

        if (ready) {
            NameValuePairs nvps = new NameValuePairs();

            nvps.put(Constants.PR_CERTIFICATE_TYPE, wizardInfo.getCertType());
            nvps.put(Constants.PR_SUBJECT_NAME, wizardInfo.getSubjectName());
            nvps.put(Constants.PR_TOKEN_NAME, wizardInfo.getTokenName());
            nvps.put(Constants.PR_KEY_LENGTH, wizardInfo.getKeyLength());
            nvps.put(Constants.PR_KEY_TYPE, wizardInfo.getKeyType());
            nvps.put(Constants.PR_KEY_CURVENAME, wizardInfo.getKeyCurveName());
            addValidityPeriod(wizardInfo, nvps);

            if (mBasicCheckBox.isSelected())
                addBasicConstraints(nvps);

            if (mExtendedKeyCheckBox.isSelected())
                addExtendedKey(nvps);

            if (mAKICheckBox.isSelected())
                nvps.put(Constants.PR_AKI, Constants.TRUE);

            if (mSKICheckBox.isSelected())
                nvps.put(Constants.PR_SKI, Constants.TRUE);

            if (mKeyUsageBox.isSelected())
                nvps.put(Constants.PR_KEY_USAGE, Constants.TRUE);

            if (mMIMECheckBox.isSelected())
                nvps.put(Constants.PR_DER_EXTENSION, mMIMEText.getText().trim());

            wizardInfo.put(wizardInfo.ALL_CERT_INFO, nvps);
        }

        mModified = true;
        return ready;
    }

    private void addValidityPeriod(InstallWizardInfo wizardInfo,
      NameValuePairs nvps) {
        nvps.put(Constants.PR_BEGIN_YEAR, wizardInfo.getBeginYear());
        nvps.put(Constants.PR_BEGIN_MONTH, wizardInfo.getBeginMonth());
        nvps.put(Constants.PR_BEGIN_DATE, wizardInfo.getBeginDate());
        nvps.put(Constants.PR_BEGIN_HOUR, wizardInfo.getBeginHour());
        nvps.put(Constants.PR_BEGIN_MIN, wizardInfo.getBeginMin());
        nvps.put(Constants.PR_BEGIN_SEC, wizardInfo.getBeginSec());
        nvps.put(Constants.PR_AFTER_YEAR, wizardInfo.getAfterYear());
        nvps.put(Constants.PR_AFTER_MONTH, wizardInfo.getAfterMonth());
        nvps.put(Constants.PR_AFTER_DATE, wizardInfo.getAfterDate());
        nvps.put(Constants.PR_AFTER_HOUR, wizardInfo.getAfterHour());
        nvps.put(Constants.PR_AFTER_MIN, wizardInfo.getAfterMin());
        nvps.put(Constants.PR_AFTER_SEC, wizardInfo.getAfterSec());
    }

    private void addBasicConstraints(NameValuePairs nvps) {
        if (mCACheckBox.isSelected())
            nvps.put(Constants.PR_IS_CA, Constants.TRUE);

	if (mCertPathBox.isSelected()) {
            String certLen = mCertPathText.getText().trim();
            if (!certLen.equals(""))
               nvps.put(Constants.PR_CERT_LEN, certLen);
	} else {
	    // negative number means infinity
            nvps.put(Constants.PR_CERT_LEN, "-1");
	}
    }

    private void addExtendedKey(NameValuePairs nvps) {
        if (mSSLClient.isSelected())
            nvps.put(Constants.PR_SSL_CLIENT_BIT, Constants.TRUE);
        if (mSSLServer.isSelected())
            nvps.put(Constants.PR_SSL_SERVER_BIT, Constants.TRUE);
        if (mSSLMail.isSelected())
            nvps.put(Constants.PR_SSL_MAIL_BIT, Constants.TRUE);
        if (mObjectSigning.isSelected())
            nvps.put(Constants.PR_OBJECT_SIGNING_BIT, Constants.TRUE);
        if (mTimeStamping.isSelected())
            nvps.put(Constants.PR_TIMESTAMPING_BIT, Constants.TRUE);
    }

    public void callHelp() {
        CMSAdminUtil.help(mHelpIndex);
    }

    protected void init() {
        super.init();
    }

    public void getUpdateInfo(WizardInfo info) {
    }
}
