from datetime import datetime
from os.path import join as path_join

from django.conf import settings
from django.utils import formats
from django.utils.translation import ugettext as _
from reportlab.lib import colors
from reportlab.lib.styles import ParagraphStyle, StyleSheet1
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.rl_config import defaultPageSize

from openslides.core.config import config

# register new truetype fonts
pdfmetrics.registerFont(TTFont(
    'Ubuntu', path_join(settings.SITE_ROOT, 'core/static/fonts/Ubuntu-R.ttf')))
pdfmetrics.registerFont(TTFont(
    'Ubuntu-Bold', path_join(settings.SITE_ROOT, 'core/static/fonts/Ubuntu-B.ttf')))
pdfmetrics.registerFont(TTFont(
    'Ubuntu-Italic', path_join(settings.SITE_ROOT, 'core/static/fonts/Ubuntu-RI.ttf')))
pdfmetrics.registerFont(TTFont(
    'circlefont', path_join(settings.SITE_ROOT, 'core/static/fonts/circle.ttf')))

pdfmetrics.registerFontFamily('Ubuntu', normal='Ubuntu', bold='Ubuntu-Bold', italic='Ubuntu-Italic')

# set style information
PAGE_HEIGHT = defaultPageSize[1]
PAGE_WIDTH = defaultPageSize[0]


# set custom stylesheets
stylesheet = StyleSheet1()
stylesheet.add(ParagraphStyle(
    name='Normal',
    fontName='Ubuntu',
    fontSize=10,
    leading=12,
))
stylesheet.add(ParagraphStyle(
    name='Paragraph',
    parent=stylesheet['Normal'],
    leading=14,
    spaceAfter=15
))
stylesheet.add(ParagraphStyle(
    name='Paragraph12',
    parent=stylesheet['Paragraph'],
    fontSize=12
))
stylesheet.add(ParagraphStyle(
    name='InnerParagraph',
    parent=stylesheet['Normal'],
    leading=14,
    spaceBefore=5,
    spaceAfter=5,
    bulletIndent=-15,
    bulletFontSize=8,
    bulletColor=colors.grey
))
stylesheet.add(ParagraphStyle(
    name='InnerListParagraph',
    parent=stylesheet['InnerParagraph'],
    bulletIndent=10,
    bulletFontSize=10,
    bulletColor=colors.black,
    leftIndent=30
))
stylesheet.add(ParagraphStyle(
    name='InnerMonotypeParagraph',
    parent=stylesheet['InnerParagraph'],
    fontName='Courier',
))
stylesheet.add(ParagraphStyle(
    name='InnerH1Paragraph',
    parent=stylesheet['InnerParagraph'],
    fontName='Ubuntu-Bold',
    fontSize=16,
    spaceBefore=20,
    spaceAfter=10,
))
stylesheet.add(ParagraphStyle(
    name='InnerH2Paragraph',
    parent=stylesheet['InnerH1Paragraph'],
    fontSize=12,
    spaceBefore=20,
    spaceAfter=10,
))
stylesheet.add(ParagraphStyle(
    name='InnerH3Paragraph',
    parent=stylesheet['InnerH2Paragraph'],
    fontSize=10,
    spaceBefore=15,
    spaceAfter=5,
))
stylesheet.add(ParagraphStyle(
    name='Small',
    parent=stylesheet['Normal'],
    fontSize=8
))
stylesheet.add(ParagraphStyle(
    name='Italic',
    parent=stylesheet['Normal'],
    fontName='Ubuntu-Italic',
    spaceAfter=5
))
stylesheet.add(ParagraphStyle(
    name='Bold',
    parent=stylesheet['Normal'],
    fontName='Ubuntu-Bold',
))
stylesheet.add(ParagraphStyle(
    name='Heading1',
    parent=stylesheet['Bold'],
    fontSize=24,
    leading=30,
    spaceAfter=6,
), alias='h1')
stylesheet.add(ParagraphStyle(
    name='Heading2',
    parent=stylesheet['Bold'],
    fontSize=14,
    leading=24,
    spaceAfter=10,
), alias='h2')
stylesheet.add(ParagraphStyle(
    name='Heading3',
    parent=stylesheet['Bold'],
    fontSize=12,
    leading=20,
), alias='h3')
stylesheet.add(ParagraphStyle(
    name='Heading4',
    parent=stylesheet['Bold'],
    fontSize=10,
    leading=20,
), alias='h4')
stylesheet.add(ParagraphStyle(
    name='Item',
    parent=stylesheet['Normal'],
    fontSize=14,
    leading=14,
    leftIndent=0,
    spaceAfter=15,
))
stylesheet.add(ParagraphStyle(
    name='Subitem',
    parent=stylesheet['Normal'],
    fontSize=10,
    leading=10,
    leftIndent=20,
    spaceAfter=15))
stylesheet.add(ParagraphStyle(
    name='Tablecell',
    parent=stylesheet['Normal'],
    fontSize=9))
stylesheet.add(ParagraphStyle(name='Signaturefield',
                              parent=stylesheet['Normal'],
                              spaceBefore=15)
               )

# Ballot stylesheets
stylesheet.add(ParagraphStyle(name='Ballot_title',
                              parent=stylesheet['Bold'],
                              fontSize=12,
                              leading=14,
                              leftIndent=30),
               )
stylesheet.add(ParagraphStyle(name='Ballot_subtitle',
                              parent=stylesheet['Normal'],
                              fontSize=10,
                              leading=12,
                              leftIndent=30,
                              rightIndent=20,
                              spaceAfter=5),
               )
stylesheet.add(ParagraphStyle(name='Ballot_description',
                              parent=stylesheet['Normal'],
                              fontSize=7,
                              leading=10,
                              leftIndent=30),
               )
stylesheet.add(ParagraphStyle(name='Ballot_option',
                              parent=stylesheet['Normal'],
                              fontSize=12,
                              leading=24,
                              leftIndent=30),
               )
stylesheet.add(ParagraphStyle(name='Ballot_option_name_YNA',
                              parent=stylesheet['Ballot_option'],
                              leading=14),
               )
stylesheet.add(ParagraphStyle(name='Ballot_option_name',
                              parent=stylesheet['Ballot_option_name_YNA'],
                              leading=17),
               )

stylesheet.add(ParagraphStyle(name='Ballot_option_suffix_YNA',
                              parent=stylesheet['Ballot_option_name_YNA'],
                              fontSize=8,
                              leading=11),
               )
stylesheet.add(ParagraphStyle(name='Ballot_option_suffix',
                              parent=stylesheet['Ballot_option_suffix_YNA'],
                              leading=16,
                              leftIndent=48),
               )
stylesheet.add(ParagraphStyle(name='Ballot_option_circle_YNA',
                              parent=stylesheet['Ballot_option_name_YNA'],
                              leftIndent=48,
                              spaceAfter=18),
               )
# Password paper stylesheets
stylesheet.add(ParagraphStyle(name='formfield',
                              parent=stylesheet['Normal'],
                              fontSize=12,
                              leading=18,
                              leftIndent=0),
               )
stylesheet.add(ParagraphStyle(name='formfield_value',
                              parent=stylesheet['Normal'],
                              fontName='Courier',
                              fontSize=12,
                              leading=28,
                              leftIndent=10),
               )
stylesheet.add(ParagraphStyle(name='qrcode_comment',
                              parent=stylesheet['Small'],
                              spaceBefore=6),
               )


def firstPage(canvas, doc):
    canvas.saveState()
    # page header (with event information)
    canvas.setFont('Ubuntu', 10)
    canvas.setFillGray(0.4)

    title_line = u"%s | %s" % (config["general_event_name"],
                               config["general_event_description"])
    if len(title_line) > 75:
        title_line = "%s ..." % title_line[:70]
    canvas.drawString(2.75 * cm, 28 * cm, title_line)
    if config["general_event_date"] and config["general_event_location"]:
        canvas.drawString(2.75 * cm, 27.6 * cm, u"%s, %s"
                          % (config["general_event_date"], config["general_event_location"]))

    # time
    canvas.setFont('Ubuntu', 7)
    time = formats.date_format(datetime.now(), 'DATETIME_FORMAT')
    canvas.drawString(15 * cm, 28 * cm, _("As of: %s") % time)

    # title
    if doc.title:
        canvas.setFont('Ubuntu-Bold', 24)
        canvas.setFillGray(0)
        canvas.drawString(2.75 * cm, PAGE_HEIGHT - 108, doc.title)

    # footer (with page number)
    canvas.setFont('Ubuntu', 8)
    canvas.setFillGray(0.4)
    canvas.drawString(10 * cm, 1 * cm, _("Page %s") % doc.page)
    canvas.restoreState()


def laterPages(canvas, doc):
    canvas.saveState()
    # footer (with page number)
    canvas.setFont('Ubuntu', 7)
    canvas.setFillGray(0.4)
    canvas.drawString(10 * cm, 1 * cm, _("Page %s") % doc.page)
    canvas.restoreState()