package page.tools.entity;

import java.util.Collection;

import org.wikiwebserver.core.Privilege;
import org.wikiwebserver.core.SecurityMan;

/**
 * A Payment object stores the information about a payment
 * 
 * @author Michael Gardiner
 *
 */
public class Order extends ProtectedStorable {
    
    private static final String TYPE = "Order";
    private static final Privilege CLEAR_BY_CODE_PRIVILEGE = Privilege.MODERATOR;        
    
    public String getType() {
        return TYPE;
    }     
    
    public Order() {
        super();
    }
    
    Order(String id) {
        super(id);
    }   
    
    public void setDescription(String page) {
        put("description", page);
    }
    
    public String getDescription() {
        return (String) get("description");
    }      
    
    public void setPaymentTo(String email) {
        put("paymentTo", email);
    }
    
    public String getPaymentTo() {
        return (String) get("paymentTo");
    }        
    
    public void setAmountInPennies(int pennies) {
        put("amountInPennies", new Long(pennies));
    }
    
    public int getAmountInPennies() {
        Long pennies = (Long) get("amountInPennies");
        if (pennies == null) pennies = new Long(0);
        return pennies.intValue();
    }
    
    public String getAmount() {
        return Payment.penniesToPounds(getAmountInPennies());
    }    
    
    public void setTest(boolean test) {
        put("test", new Boolean(test));
    }
    
    public boolean isTest() {
        Boolean test = (Boolean) get("test");
        if (test == null) test = new Boolean(false);
        return test.booleanValue();
    }     
    
    public void setPaymentResponder(String page) {
        put("paymentResponder", page);
    }
    
    public String getPaymentResponder() {
        return (String) get("paymentResponder");
    }   
    
    public void setAPCResponder(String page) {
        put("apcResponder", page);
    }
    
    public String getAPCResponder() {
        return (String) get("apcResponder");
    }     
    
    public void setPayer(User payer) {
        put("payerUserID", payer.getId());
    }
    
    public User getPayer() {
        String payerUserID = (String) get("payerUserID");
        if (payerUserID == null) return null;
        return User.getUserById(payerUserID);
    } 
    
    public void setPayment(Payment payment) {
        put("paymentID", payment.getId());
    }
    
    public Payment getPayment() {
        String paymentID = (String) get("paymentID");
        if (paymentID == null) return null;
        return Payment.getPaymentById(paymentID);
    }    

    
    public void setPaymentRequest(String request) {
        put("paymentRequest", request);
    }
    
    public String getPaymentRequest() {
        return (String) get("paymentRequest");
    }        
    
    
    public static Order getOrderById(String id) {
        Order o = new Order(id);
        if (o.isValid()) return o;
        // Not created
        return null; 
    }      
    
    public static Collection<String> listIds() {
        return listIds(TYPE);
    }      
    
    public String toString() {
        String LF = "\r\n";
        
        StringBuilder info = new StringBuilder();
        info.append("PaymentID: " + getId() + LF);
        info.append("Description: " + getDescription() + LF);
        info.append("PaymentTo: " + getPaymentTo() + LF);
        info.append("Amount: " + getAmount() + LF);
        info.append("Test: " + isTest() + LF);
        info.append("UserID: " + getPayer().getId() + LF);
        info.append("PaymentRequest: " + getPaymentRequest() + LF);
        String paymentID = getPayment() == null ? "none" : getPayment().getId();
        info.append("PaymentID:" + paymentID + LF);
        info.append("APCResponder:" + getAPCResponder() + LF);
        info.append("PaymentResponder:" + getPaymentResponder() + LF);
        
        return info.toString();
    }
    
    
    protected void checkCanClear() {
        Privilege privilege = SecurityMan.getCodePrivilege();
        if (privilege.isBelow(CLEAR_BY_CODE_PRIVILEGE)) {
            throw new SecurityException(privilege.getLabel() +
                      " code is not permitted to clear this entity");
        }
    }    
}

