class PagSeguroPaymentRequest:
    sender = None
    currency = None
    items = None
    itemsCount = 0
    redirectURL = None
    extraAmount = None
    reference = None
    shipping = None
    maxAge = None
    maxUses = None
    
    def getSender(self):
        return self.sender
    
    def setSender(self, name, email = None, areaCode = None, number = None):
        param = name
        if isinstance(param, (list, tuple)):
            self.sender = PagSeguroSender(param)
        else:
            sender = PagSeguroSender()
            sender.setName(param)
            sender.setEmail(email)
            sender.setPhone(PagSeguroPhone(areaCode, number))
            self.sender = sender
            
    def setSenderName(self, senderName):
        if self.sender == None:
            self.sender = PagSeguroSender()
        self.sender.setName(senderName)
        
    def setSenderEmail(self, senderEmail):
        if self.sender == None:
            self.sender = PagSeguroSender()
        self.sender.setEmail(senderEmail)
        
    def setSenderPhone(self, areaCode, number = None):
        param = areaCode
        if self.sender == None:
            self.sender = PagSeguroSender()
        if isinstance(param, PagSeguroPhone):
            self.sender.setPhone(param)
        else:
            self.sender.setPhone(PagSeguroPhone(param, number))
    
    def getCurrency(self):
        return self.currency
    
    def setCurrency(self, currency):
        self.currency = currency    
        
    def getItems(self):
        return self.items
    
    def setItems(self, items):
        if isinstance(items, (list, tuple)):
            i = {}
            for x, v in items:
                if isinstance(v, PagSeguroItem):
                    i[x] = v
                elif isinstance(v, (list, tuple)):
                    i[x] = PagSeguroItem(v)
            self.items = i
            
    def addItem(self, _id, description = None, quantity = None, amount = None, weight = None, shippingCost = None):
        param = _id
        if self.items == None:
            self.items = {}
        if isinstance(param, (list, tuple)):
            self.items[self.itemsCount] = PagSeguroItem(param)
            self.itemsCount = self.itemsCount + 1
        elif isinstance(param, PagSeguroItem):
            self.items[self.itemsCount] = param
            self.itemsCount = self.itemsCount + 1
        else:
            item = PagSeguroItem()
            item.setId(param)
            item.setDescription(description)
            item.setQuantity(quantity)
            item.setAmount(amount)
            item.setWeight(weight)
            item.setShippingCost(shippingCost)
            self.items[self.itemsCount] = item
            self.itemsCount = self.itemsCount + 1
            
    def getRedirectURL(self):
        return self.redirectURL
    
    def setRedirectURL(self, redirectURL):
        self.redirectURL = redirectURL
        
    def getExtraAmount(self):
        return self.extraAmount
    
    def setExtraAmount(self, extraAmount):
        self.extraAmount = extraAmount
        
    def getReference(self):
        return self.reference
    
    def setReference(self, reference):
        self.reference = reference
    
    def getShipping(self):
        return self.shipping
    
    def setShipping(self, address, _type=None):
        param = address
        if isinstance(param,PagSeguroShipping):
            self.shipping = param
        else:
            shipping = PagSeguroShipping()
            if isinstance(param, (list, tuple)):
                shipping.setAddress(PagSeguroAddress(param))
            elif isinstance(param, PagSeguroAddress):
                shipping.setAddress(param)
            if type:
                if isinstance(_type, PagSeguroShippingType):
                    shipping.setType(_type)
                else:
                    shipping.setType(PagSeguroShippingType(_type))
            self.shipping = shipping
            
    def setShippingAddress(self, postalCode = None, street = None, number = None, complement = None, district = None, city = None, state = None, country = None):
        param = postalCode
        if self.shipping == None:
            self.shipping = PagSeguroShipping()
        if isinstance(param, (list, tuple)):
            self.shipping.setAddress(PagSeguroAddress(param))
        elif isinstance(param,PagSeguroAddress):
            self.shipping.setAddress(param)
        else:
            address = PagSeguroAddress()
            address.setPostalCode(postalCode)
            address.setStreet(street)
            address.setNumber(number)
            address.setComplement(complement)
            address.setDistrict(district)
            address.setCity(city)
            address.setState(state)
            address.setCountry(country)
            self.shipping.setAddress(address)
    
    def setShippingType(self, _type):
        param = _type
        if self.shipping == None:
            self.shipping = PagSeguroShipping()
        if isinstance(param, PagSeguroShippingType):
            self.shipping.setType(param)
        else:
            self.shipping.setType(PagSeguroShippingType(param))
    
    def getMaxAge(self):
        return self.maxAge
    
    def setMaxAge(self, maxAge):
        self.maxAge = maxAge
        
    def getMaxUses(self):
        return self.maxUses
    
    def setMaxUses(self, maxUses):
        self.maxUses = maxUses
    
    def register(self, credentials):
        #TODO VERIFY INSTANCE CREDENTIALS
        return PagSeguroPaymentService.createCheckoutRequest(credentials, self)
    
    def __unicode__(self):
        email = None
        if self.sender and self.sender.getEmail():
            email = self.sender.getEmail()
        return "PagSeguroPaymentRequest(Reference=%s,     SenderEmail=%s)" % (self.reference, email)