/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* $Id$ */

package org.apache.fop.pdf;

/**
 * This class holds the parameters for PDF encryption.
 */
public class PDFEncryptionParams {

    private String userPassword = ""; //May not be null
    private String ownerPassword = ""; //May not be null

    private boolean allowPrint = true;
    private boolean allowCopyContent = true;
    private boolean allowEditContent = true;
    private boolean allowEditAnnotations = true;
    private boolean allowFillInForms = true;
    private boolean allowAccessContent = true;
    private boolean allowAssembleDocument = true;
    private boolean allowPrintHq = true;
    private boolean encryptMetadata = true;

    private int encryptionLengthInBits = 128;

    /**
     * Creates a new instance.
     * @param userPassword the user password
     * @param ownerPassword the owner password
     * @param allowPrint true if printing is allowed
     * @param allowCopyContent true if copying content is allowed
     * @param allowEditContent true if editing content is allowed
     * @param allowEditAnnotations true if editing annotations is allowed
     */
    public PDFEncryptionParams(String userPassword, String ownerPassword,
                               boolean allowPrint,
                               boolean allowCopyContent,
                               boolean allowEditContent,
                               boolean allowEditAnnotations,
                               boolean encryptMetadata) {
        setUserPassword(userPassword);
        setOwnerPassword(ownerPassword);
        setAllowPrint(allowPrint);
        setAllowCopyContent(allowCopyContent);
        setAllowEditContent(allowEditContent);
        setAllowEditAnnotations(allowEditAnnotations);
        this.encryptMetadata = encryptMetadata;
    }

    /**
     * Default constructor initializing to default values.
     */
    public PDFEncryptionParams() {
        //nop
    }

    /**
     * Creates a copy of the given encryption parameters.
     *
     * @param source source encryption parameters
     */
    public PDFEncryptionParams(PDFEncryptionParams source) {
        setUserPassword(source.getUserPassword());
        setOwnerPassword(source.getOwnerPassword());
        setAllowPrint(source.isAllowPrint());
        setAllowCopyContent(source.isAllowCopyContent());
        setAllowEditContent(source.isAllowEditContent());
        setAllowEditAnnotations(source.isAllowEditAnnotations());
        setAllowAssembleDocument(source.isAllowAssembleDocument());
        setAllowAccessContent(source.isAllowAccessContent());
        setAllowFillInForms(source.isAllowFillInForms());
        setAllowPrintHq(source.isAllowPrintHq());
        setEncryptionLengthInBits(source.getEncryptionLengthInBits());
        encryptMetadata = source.encryptMetadata();
    }

    /**
     * Indicates whether copying content is allowed.
     * @return true if copying is allowed
     */
    public boolean isAllowCopyContent() {
        return allowCopyContent;
    }

    /**
     * Indicates whether editing annotations is allowed.
     * @return true is editing annotations is allowed
     */
    public boolean isAllowEditAnnotations() {
        return allowEditAnnotations;
    }

    /**
     * Indicates whether editing content is allowed.
     * @return true if editing content is allowed
     */
    public boolean isAllowEditContent() {
        return allowEditContent;
    }

    /**
     * Indicates whether printing is allowed.
     * @return true if printing is allowed
     */
    public boolean isAllowPrint() {
        return allowPrint;
    }

    /**
     * Indicates whether revision 3 filling in forms is allowed.
     * @return true if revision 3 filling in forms is allowed
     */
    public boolean isAllowFillInForms() {
        return allowFillInForms;
    }

    /**
     * Indicates whether revision 3 extracting text and graphics is allowed.
     * @return true if revision 3 extracting text and graphics is allowed
     */
    public boolean isAllowAccessContent() {
        return allowAccessContent;
    }

    /**
     * Indicates whether revision 3 assembling document is allowed.
     * @return true if revision 3 assembling document is allowed
     */
    public boolean isAllowAssembleDocument() {
        return allowAssembleDocument;
    }

    /**
     * Indicates whether revision 3 printing to high quality is allowed.
     * @return true if revision 3 printing to high quality is allowed
     */
    public boolean isAllowPrintHq() {
        return allowPrintHq;
    }

    /**
     * Indicates whether Metadata should be encrypted.
     * @return true or false
     */
    public boolean encryptMetadata() {
        return encryptMetadata;
    }

    /**
     * Returns the owner password.
     * @return the owner password, an empty string if no password applies
     */
    public String getOwnerPassword() {
        return ownerPassword;
    }

    /**
     * Returns the user password.
     * @return the user password, an empty string if no password applies
     */
    public String getUserPassword() {
        return userPassword;
    }

    /**
     * Sets the permission for copying content.
     * @param allowCopyContent true if copying content is allowed
     */
    public void setAllowCopyContent(boolean allowCopyContent) {
        this.allowCopyContent = allowCopyContent;
    }

    /**
     * Sets the permission for editing annotations.
     * @param allowEditAnnotations true if editing annotations is allowed
     */
    public void setAllowEditAnnotations(boolean allowEditAnnotations) {
        this.allowEditAnnotations = allowEditAnnotations;
    }

    /**
     * Sets the permission for editing content.
     * @param allowEditContent true if editing annotations is allowed
     */
    public void setAllowEditContent(boolean allowEditContent) {
        this.allowEditContent = allowEditContent;
    }

    /**
     * Sets the permission for printing.
     * @param allowPrint true if printing is allowed
     */
    public void setAllowPrint(boolean allowPrint) {
        this.allowPrint = allowPrint;
    }

    /**
     * Sets whether revision 3 filling in forms is allowed.
     * @param allowFillInForms true if revision 3 filling in forms is allowed.
     */
    public void setAllowFillInForms(boolean allowFillInForms) {
        this.allowFillInForms = allowFillInForms;
    }

    /**
     * Sets whether revision 3 extracting text and graphics is allowed.
     * @param allowAccessContent true if revision 3 extracting text and graphics is allowed
     */
    public void setAllowAccessContent(boolean allowAccessContent) {
        this.allowAccessContent = allowAccessContent;
    }

    /**
     * Sets whether revision 3 assembling document is allowed.
     * @param allowAssembleDocument true if revision 3 assembling document is allowed
     */
    public void setAllowAssembleDocument(boolean allowAssembleDocument) {
        this.allowAssembleDocument = allowAssembleDocument;
    }

    /**
     * Sets whether revision 3 printing to high quality is allowed.
     * @param allowPrintHq true if revision 3 printing to high quality is allowed
     */
    public void setAllowPrintHq(boolean allowPrintHq) {
        this.allowPrintHq = allowPrintHq;
    }

    /**
     * Whether the Metadata should be encrypted or not; default is true;
     * @param encryptMetadata true or false
     */
    public void setEncryptMetadata(boolean encryptMetadata) {
        this.encryptMetadata = encryptMetadata;
    }

    /**
     * Sets the owner password.
     * @param ownerPassword The owner password to set, null or an empty String
     * if no password is applicable
     */
    public void setOwnerPassword(String ownerPassword) {
        if (ownerPassword == null) {
            this.ownerPassword = "";
        } else {
            this.ownerPassword = ownerPassword;
        }
    }

    /**
     * Sets the user password.
     * @param userPassword The user password to set, null or an empty String
     * if no password is applicable
     */
    public void setUserPassword(String userPassword) {
        if (userPassword == null) {
            this.userPassword = "";
        } else {
            this.userPassword = userPassword;
        }
    }

    /**
     * Returns the encryption length.
     * @return the encryption length
     */
    public int getEncryptionLengthInBits() {
        return encryptionLengthInBits;
    }

    /**
     * Sets the encryption length.
     *
     * @param encryptionLength the encryption length
     */
    public void setEncryptionLengthInBits(int encryptionLength) {
        this.encryptionLengthInBits = encryptionLength;
    }

    public String toString() {
        return "userPassword = " + userPassword + "\n"
                + "ownerPassword = " + ownerPassword + "\n"
                + "allowPrint = " + allowPrint + "\n"
                + "allowCopyContent = " + allowCopyContent + "\n"
                + "allowEditContent = " + allowEditContent + "\n"
                + "allowEditAnnotations = " + allowEditAnnotations + "\n"
                + "allowFillInForms  = " + allowFillInForms + "\n"
                + "allowAccessContent = " + allowAccessContent + "\n"
                + "allowAssembleDocument = " + allowAssembleDocument + "\n"
                + "allowPrintHq = " + allowPrintHq + "\n"
                + "encryptMetadata = " + encryptMetadata;
    }

}
