#!/usr/bin/python
# -*- coding: utf-8 -*-

import web
from web import form
import cairo, datetime, math, io, StringIO
import grid

urls = (
 '/rect/', 'Rect',
 '/dia/', 'Diamond',
 '/circ/(.*)', 'Circ',
 '/hex/', 'Hex',
 '/oval/', 'Oval',
 '/arc/', 'Arc',
 '/img/(.*)', 'ImgHandler',
 '/pdf/(.*)', 'PdfHandler',
 '.*', 'StartHandler',
)

render = web.template.render('gridtemplates/')
app = web.application(urls, globals())

class StartHandler(object):
  def GET(self):
    #web.header('Content-Type', 'application/xhtml+xml;charset=UTF-8')
    tpl = web.template.frender('gridtemplates/main.xhtml')
    content = render.start()
    return tpl(u'Erzeugen von Rasterpapier', content)
    #return render.start()

class ImgHandler(object):
  def GET(self, data):
    web.header('Content-Type', 'image/png')
    f = StringIO.StringIO()
    grid.drawGridPng(f, data)
    #surface.write_to_png('cairo1.png')
    s = f.getvalue()
    f.close()
    return s

class PdfHandler(object):
  def GET(self, data):
    env = web.ctx.env
    remoteAddr = env['REMOTE_ADDR']
    web.header('Content-Type', 'application/pdf')
    web.header('Content-Disposition', 'attachment; filename=kniplingrid.pdf')
    f = io.BytesIO()
    grid.drawGridPdf(f, data)
    #surface.write_to_png('cairo1.png')
    s = f.getvalue()
    f.close()
    return s

rectForm = form.Form(
  form.Textbox('dx', 
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Waagerechter Abstand:",
    size='5',
    post='cm',
    value="0,5"),
  form.Textbox('dy',
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Senkrechter Abstand:",
    post='cm',
    size='5',
    value="0,5"),
  form.Checkbox('alternate',
    description='abwechselnd',
    id='alt'),
)

class Rect(object):
  def GET(self):
    data = web.input()
    form = rectForm()
    if 'dx' in data:
      form.dx.set_value(data['dx'])
    if 'dy' in data:
      form.dy.set_value(data['dy'])
    if 'alternate' in data:
      form.alternate.set_value(True)
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Rechteckraster', render.rect(form, True))
  def POST(self):
    data = web.input()
    alt = 'alternate' in data
    form = rectForm()
    form.alternate.set_value(alt)
    ok = form.validates()
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Rechteckraster', render.rect(form, ok))

diaForm = form.Form(
  form.Textbox('dx', 
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Waagerechter Abstand:",
    size='5',
    post='cm',
    value="0,5"),
  form.Textbox('phi',
    form.regexp(r'^\d+$', 'Zahl erforderlich'),
    form.Validator('Zwischen 5 und 85', 
      lambda x: int(x) >= 5 and int(x) <= 85),
    description="Winkel zur Waagerechten:",
    size='5',
    post='°',
    value="60"),
)

class Diamond(object):
  def GET(self):
    form = diaForm()
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Rautenraster', render.dia(form, True))
  def POST(self):
    data = web.input()
    form = diaForm()
    ok = form.validates()
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Rautenraster', render.dia(form, ok))

circForm = form.Form(
  form.Textbox('dia', 
    form.regexp(r'^\d+$', 'Zahl erforderlich'),
    form.Validator('Zwischen 2 und 20 cm', 
      lambda x: int(x) >= 2 and int(x) <= 20),
    description="Durchmesser:",
    size='5',
    post='cm',
    value="20"),
  form.Textbox('dr', 
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Radialer Abstand:",
    size='5',
    post='cm',
    value="0,5"),
  form.Textbox('symm',
    form.regexp(r'^\d+$', 'Zahl erforderlich'),
    description="Symmetrische Teile:",
    size='5',
    value="6"),
  form.Textbox('parts',
    form.regexp(r'^\d+$', 'Zahl erforderlich'),
    description="Teilung Sektor:",
    size='5',
    value="18"),
  form.Checkbox('alternate',
    description='abwechselnd',
    id='alt'),
)

class Circ(object):
  def GET(self,params):
    data = web.input()
    form = circForm()
    if 'dia' in data:
      form.dia.set_value(data['dia'])
    if 'dr' in data:
      form.dr.set_value(data['dr'])
    dd = {'ok': True }
    symm = int(form['symm'].value)
    parts = int(form['parts'].value)
    diam = int(form['dia'].value)
    sects = symm*parts
    dp = diam*math.pi/sects
    dd['sects'] = sects
    dd['dp'] = '%.2f' % dp
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Kreisraster', render.circ(form, dd))
  def POST(self):
    data = web.input()
    alt = 'alternate' in data
    form = circForm()
    form.alternate.set_value(alt)
    dd = {}
    dd['ok'] = form.validates()
    if dd['ok']:
      symm = int(form['symm'].value)
      parts = int(form['parts'].value)
      diam = int(form['dia'].value)
      sects = symm*parts
      dp = diam*math.pi/sects
      dd['sects'] = sects
      dd['dp'] = '%.2f' % dp
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Kreisraster', render.circ(form, dd))

hexForm = form.Form(
  form.Textbox('dx', 
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Rasterabstand:",
    size='5',
    post='cm',
    value="0,5"),
)

class Hex(object):
  def GET(self):
    form = hexForm()
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Wabenraster', render.hex(form, True))
  def POST(self):
    data = web.input()
    alt = 'alternate' in data
    form = hexForm()
    ok = form.validates()
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Wabenraster', render.hex(form, ok))

ovalForm = form.Form(
  form.Textbox('xmax', 
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Breite:",
    size='5',
    post='cm',
    value="20"),
  form.Textbox('ymax', 
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Höhe:",
    size='5',
    post='cm',
    value="15"),
  form.Textbox('width', 
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Dicke:",
    size='5',
    post='cm',
    value="5"),
  form.Textbox('dr',
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Radialer Abstand:",
    post='cm',
    size='5',
    value="0,5"),
  form.Textbox('dp',
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Abstand Umfang:",
    post='cm',
    size='5',
    value="0,5"),
  form.Checkbox('alternate',
    description='abwechselnd',
    id='alt'),
  form.Dropdown('variant',
    [('oval1', u'Kreisbögen'), ('oval2', u'Ellipse')],
    description='Variante:'),
)

class Oval(object):
  def GET(self):
    form = ovalForm()
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Ovalraster', render.oval(form, True))
  def POST(self):
    data = web.input()
    alt = 'alternate' in data
    form = ovalForm()
    form.alternate.set_value(alt)
    ok = form.validates()
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Ovalraster', render.oval(form, ok))

arcForm = form.Form(
  form.Textbox('dia', 
    form.regexp(r'^\d+$', 'Zahl erforderlich'),
    form.Validator('Zwischen 20 und 100 cm', 
      lambda x: int(x) >= 20 and int(x) <= 100),
    description="Durchmesser:",
    size='5',
    post='cm',
    value="40"),
  form.Textbox('width', 
    form.regexp(r'^\d+$', 'Zahl erforderlich'),
    form.Validator('Zwischen 2 und 20 cm', 
      lambda x: int(x) >= 2 and int(x) <= 20),
    description="Dicke:",
    size='5',
    post='cm',
    value="10"),
  form.Textbox('dr', 
    form.regexp(r'^\d+(,\d+)?$', 'Zahl erforderlich'),
    description="Radialer Abstand:",
    size='5',
    post='cm',
    value="0,5"),
  form.Textbox('symm',
    form.regexp(r'^\d+$', 'Zahl erforderlich'),
    description="Symmetrische Teile:",
    size='5',
    value="6"),
  form.Textbox('parts',
    form.regexp(r'^\d+$', 'Zahl erforderlich'),
    description="Teilung Sektor:",
    size='5',
    value="44"),
  form.Checkbox('alternate',
    description='abwechselnd',
    id='alt'),
)

class Arc(object):
  def GET(self):
    form = arcForm()
    dd = {'ok': True }
    symm = int(form['symm'].value)
    parts = int(form['parts'].value)
    diam = int(form['dia'].value)
    sects = symm*parts
    dp = diam*math.pi/sects
    dd['sects'] = sects
    dd['dp'] = '%.2f' % dp
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Kreisbogenraster', render.arc(form, dd))
  def POST(self):
    data = web.input()
    alt = 'alternate' in data
    form = arcForm()
    form.alternate.set_value(alt)
    dd = {}
    dd['ok'] = form.validates()
    if dd['ok']:
      symm = int(form['symm'].value)
      parts = int(form['parts'].value)
      diam = int(form['dia'].value)
      sects = symm*parts
      dp = diam*math.pi/sects
      dd['sects'] = sects
      dd['dp'] = '%.2f' % dp
    tpl = web.template.frender('gridtemplates/main.xhtml')
    return tpl(u'Kreisbogenraster', render.arc(form, dd))

if __name__ == "__main__":
  #web.internalerror = web.debugerror
  app.run()
