# vim: tabstop=4 shiftwidth=4 softtabstop=4

#
#    Licensed 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.

import logging
import routes

from heat.api.v1 import stacks
from heat.common import wsgi

from webob import Request

logger = logging.getLogger(__name__)

class API(wsgi.Router):

    """
    WSGI router for Heat v1 API requests.
    """

    def action_match(self, action, environ):

        req = Request(environ)

        env_action = req.GET.get("Action")

        if action == env_action:
            return True
        else:
            return False

    def action_ListStacks(self, environ, result):
        return self.action_match('ListStacks', environ)

    def action_CreateStack(self, environ, result):
        return self.action_match('CreateStack', environ)

    def action_DescribeStacks(self, environ, result):
        return self.action_match('DescribeStacks', environ)

    def action_DeleteStack(self, environ, result):
        return self.action_match('DeleteStack', environ)

    def action_UpdateStack(self, environ, result):
        return self.action_match('UpdateStack', environ)

    def action_DescribeStackEvents(self, environ, result):
        return self.action_match('DescribeStackEvents', environ)

    def action_ValidateTemplate(self, environ, result):
        return self.action_match('ValidateTemplate', environ)

    def __init__(self, conf, **local_conf):
        self.conf = conf
        mapper = routes.Mapper()

        stacks_resource = stacks.create_resource(conf)

        mapper.resource("stack", "stacks", controller=stacks_resource,
            collection={'detail': 'GET'})

        mapper.connect("/", controller=stacks_resource,
            action="list", conditions=dict(function=self.action_ListStacks))

        mapper.connect("/", controller=stacks_resource,
            action="create", conditions=dict(function=self.action_CreateStack))

        mapper.connect("/", controller=stacks_resource,
            action="describe", 
            conditions=dict(function=self.action_DescribeStacks))

        mapper.connect("/", controller=stacks_resource,
            action="delete", conditions=dict(function=self.action_DeleteStack))

        mapper.connect("/", controller=stacks_resource,
            action="update", conditions=dict(function=self.action_UpdateStack))

        mapper.connect("/", controller=stacks_resource,
            action="events_list",
            conditions=dict(function=self.action_DescribeStackEvents))

        mapper.connect("/", controller=stacks_resource,
                       action="validate_template",
                       conditions=dict(function=self.action_ValidateTemplate))

        mapper.connect("/", controller=stacks_resource, action="index")

        super(API, self).__init__(mapper)

@@ -613,16 +613,46 @@
 cense.%0A%0A
+from functools import partial%0A
 import l
@@ -799,16 +799,17 @@
 ame__)%0A%0A
+%0A
 class AP
@@ -926,20 +926,27 @@
  environ
+, result
 ):%0A
-%0A
         
@@ -964,25 +964,24 @@
 st(environ)%0A
-%0A
         env_
@@ -1011,25 +1011,24 @@
 ction%22)%0A
-%0A
         
 if actio
@@ -1019,18 +1019,22 @@
         
-if
+return
  action 
@@ -1050,864 +1050,212 @@
 tion
-:%0A            return True%0A        else:%0A            return False%0A%0A    def action_ListStacks(self, environ, result):%0A        return self.action_match('ListStacks', environ)%0A%0A    def action_CreateStack(self, environ, result):%0A        return self.action_match('CreateStack', environ)%0A%0A    def action_DescribeStacks(self, environ, result):%0A        return self.action_match('DescribeStacks', environ)%0A%0A    def action_DeleteStack(self, environ, result):%0A        return self.action_match('DeleteStack', environ)%0A%0A    def action_UpdateStack(self, environ, result):%0A        return self.action_match('UpdateStack', environ)%0A%0A    def action_DescribeStackEvents(self, environ, result):%0A        return self.action_match('DescribeStackEvents', environ)%0A%0A    def action_ValidateTemplate(self, environ, result):%0A        return self.action_match('ValidateTemplate', environ
+%0A%0A    def action(self, name):%0A        %22%22%22%0A        Return a function that matches a request's %60Action%60 query parameter to%0A        the given value.%0A        %22%22%22%0A        return partial(self.action_match, name
 )%0A%0A 
@@ -1645,17 +1645,18 @@
 f.action
-_
+('
 ListStac
@@ -1653,24 +1653,26 @@
 ('ListStacks
+')
 ))%0A%0A        
@@ -1743,24 +1743,36 @@
 on=%22create%22,
+%0A           
  conditions=
@@ -1796,17 +1796,18 @@
 f.action
-_
+('
 CreateSt
@@ -1801,32 +1801,34 @@
 ion('CreateStack
+')
 ))%0A%0A        mapp
@@ -1901,17 +1901,16 @@
 scribe%22,
- 
 %0A       
@@ -1942,33 +1942,34 @@
 tion=self.action
-_
+('
 DescribeStacks))
@@ -1966,16 +1966,18 @@
 beStacks
+')
 ))%0A%0A    
@@ -2052,24 +2052,36 @@
 on=%22delete%22,
+%0A           
  conditions=
@@ -2105,17 +2105,18 @@
 f.action
-_
+('
 DeleteSt
@@ -2114,24 +2114,26 @@
 'DeleteStack
+')
 ))%0A%0A        
@@ -2208,16 +2208,28 @@
 update%22,
+%0A           
  conditi
@@ -2257,17 +2257,18 @@
 f.action
-_
+('
 UpdateSt
@@ -2270,16 +2270,18 @@
 ateStack
+')
 ))%0A%0A    
@@ -2414,17 +2414,18 @@
 f.action
-_
+('
 Describe
@@ -2435,16 +2435,18 @@
 ckEvents
+')
 ))%0A%0A    
@@ -2607,17 +2607,18 @@
 f.action
-_
+('
 Validate
@@ -2625,16 +2625,18 @@
 Template
+')
 ))%0A%0A    

Clean up the API routes