# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
# (c) 2005 Clark C. Evans
# This module is part of the Python Paste Project and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
# This code was written with funding by http://prometheusresearch.com
"""
Various Applications for Debugging/Testing Purposes
"""

import time
__all__ = ['SimpleApplication', 'SlowConsumer']


class SimpleApplication(object):
    """
    Produces a simple web page
    """
    def __call__(self, environ, start_response):
        body = b"<html><body>simple</body></html>"
        start_response("200 OK", [('Content-Type', 'text/html'),
                                  ('Content-Length', str(len(body)))])
        return [body]

class SlowConsumer(object):
    """
    Consumes an upload slowly...

    NOTE: This should use the iterator form of ``wsgi.input``,
          but it isn't implemented in paste.httpserver.
    """
    def __init__(self, chunk_size = 4096, delay = 1, progress = True):
        self.chunk_size = chunk_size
        self.delay = delay
        self.progress = True

    def __call__(self, environ, start_response):
        size = 0
        total  = environ.get('CONTENT_LENGTH')
        if total:
            remaining = int(total)
            while remaining > 0:
                if self.progress:
                    print("%s of %s remaining" % (remaining, total))
                if remaining > 4096:
                    chunk = environ['wsgi.input'].read(4096)
                else:
                    chunk = environ['wsgi.input'].read(remaining)
                if not chunk:
                    break
                size += len(chunk)
                remaining -= len(chunk)
                if self.delay:
                    time.sleep(self.delay)
            body = "<html><body>%d bytes</body></html>" % size
        else:
            body = ('<html><body>\n'
                '<form method="post" enctype="multipart/form-data">\n'
                '<input type="file" name="file">\n'
                '<input type="submit" >\n'
                '</form></body></html>\n')
        print("bingles")
        start_response("200 OK", [('Content-Type', 'text/html'),
                                  ('Content-Length', len(body))])
        return [body]

def make_test_app(global_conf):
    return SimpleApplication()

make_test_app.__doc__ = SimpleApplication.__doc__

def make_slow_app(global_conf, chunk_size=4096, delay=1, progress=True):
    from paste.deploy.converters import asbool
    return SlowConsumer(
        chunk_size=int(chunk_size),
        delay=int(delay),
        progress=asbool(progress))

make_slow_app.__doc__ = SlowConsumer.__doc__
