#!/bin/env python3
# coding=utf-8
#
# Copyright (C) 2019 Marc Jeanmougin, Cédric Gémy, a-l-e
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
#


import os
import re
import sys
import inkex
from inkex import AbortExtension
from inkex.base import TempDirMixin
from inkex.command import take_snapshot, call


SCRIBUS_EXE = "scribus"
VERSION_REGEX = re.compile(r"(\d+)\.(\d+)\.(\d+)")


# several things could be taken into consideration here :
# - the fact that openDoc works on svg files is a workaround
# - the commented parts should be the correct way to do things
#   and even include a possibility to add margins
#   BUT currently fails to place the SVG document
#   (object placed top-left instead of SVG placed top-left)
class Scribus(TempDirMixin, inkex.OutputExtension):
    def add_arguments(self, arg_parser):
        arg_parser.add_argument("--pdf-version", type=int, dest="pdfVersion", default="13",
                                help="PDF version (e.g. integer numbers between 11 and 15, see Scribus documentation for details)")
        arg_parser.add_argument("--bleed", type=float, dest="bleed", default="0",
                                help="Bleed value")
        arg_parser.add_argument("--bleed-marks", type=inkex.Boolean, dest="bleedMarks",
                default=False, help="Draw bleed marks")
        arg_parser.add_argument("--color-marks", type=inkex.Boolean, dest="colorMarks",
                default=False, help="Draw color Marks")
        arg_parser.add_argument("--intent", type=int, dest="intent", default="0",
                                help="Rendering intent. Options: 0: Perceptual, 1: Relative Colorimetric, 2: Saturation, 3: Absolute Colorimetric")
        arg_parser.add_argument("--title", type=str, dest="title", default="", help="PDF title, required for PDF/X")
        #arg_parser.add_argument("--fonts", type=int, dest="fonts", default="1",
        #                        help="Embed fonts : 0 for embedding, 1 to convert to path, 2 to prevent embedding")

    def generate_script(self, stream, width, height, icc):
        margin = self.options.bleed
        pdfVersion = self.options.pdfVersion
        embedFonts = 1 #self.options.fonts
        bleedMarks = self.options.bleedMarks
        colorMarks = self.options.colorMarks
        if ((bleedMarks or colorMarks) and margin < 7):
            raise AbortExtension("You need at least 7mm bleed to show cutting marks or color marks")
        if (bleedMarks or colorMarks):
            margin = margin - 7 #because scribus is weird. At the time of 1.5.5, it adds 7 when those are set.
        stream.write(f"""
import scribus
import sys
icc = "{icc}"
margin = {margin}
class exportPDF():
    def __init__(self, svg=sys.argv[1], o=sys.argv[2]):
        #scribus.newDocument(({width},{height}), (margin,margin,margin,margin),
        #                    PORTRAIT, 1, UNIT_MILLIMETERS, PAGE_1, 0, 1)
        #scribus.placeSVG(svg, 0, 0)
        scribus.openDoc(svg)
        pdf = scribus.PDFfile()
        scribus.setUnit(UNIT_MILLIMETERS)
        pdf.bleedl = margin
        pdf.bleedr = margin
        pdf.bleedt = margin
        pdf.bleedb = margin
        pdf.useDocBleeds = False
        pdf.cropMarks = {bleedMarks}
        pdf.bleedMarks = {bleedMarks}
        pdf.colorMarks = {colorMarks}
        pdf.version = {pdfVersion}
        pdf.allowAnnots = True
        pdf.allowChange = True
        pdf.allowCopy = True
        pdf.allowPrinting = True
        pdf.noembicc = False #embed icc !
        pdf.solidpr = icc
        pdf.imagepr = icc
        pdf.printprofc = icc
        pdf.intenti = {self.options.intent}
        pdf.intents = {self.options.intent}
        pdf.info = "{self.options.title}"
        pdf.profiles = True
        pdf.profilei = True
        pdf.outdst = 1 # output destination : 0=screen, 1=printer
        pdf.file = o
        pdf.compress = True
        pdf.compressmtd = 0 # 0 = automatic, 1 = jpeg ; 2 = zip, 3 = none
        pdf.quality = 0 #max
        pdf.fontEmbedding = {embedFonts}
        pdf.thumbnails = True

        pdf.save()
exportPDF()""")

    def save(self, stream):
        scribus_version = call(SCRIBUS_EXE, '-g', '--version')
        version_match = VERSION_REGEX.search(scribus_version)
        if version_match is None:
            raise AbortExtension(f"Could not detect Scribus version ({scribus_version})")
        major = int(version_match.group(1))
        minor = int(version_match.group(2))
        point = int(version_match.group(3))
        if (major < 1) or (major == 1 and minor < 5):
            raise AbortExtension(f"Found Scribus {version_match.group(0)}. This extension requires Scribus 1.5.x.")

        input_file = self.options.input_file
        py_file = os.path.join(self.tempdir, 'scribus.py')
        svg_file = os.path.join(self.tempdir, 'in.svg')
        profiles = self.svg.defs.findall("svg:color-profile")
        if len(profiles) == 0:
            raise AbortExtension("Please select a color profile in the document settings.")
        elif len(profiles) > 1:
            raise AbortExtension("Please only link a single color profile in the document settings. No output generated.")
        iccPath = profiles[0].get("xlink:href")


        with open(input_file) as f:
            with open(svg_file, "w") as f1:
                for line in f:
                    f1.write(line)
            f.close()

        pdf_file = os.path.join(self.tempdir, 'out.pdf')
        width = self.svg.unittouu(self.svg.get('width'))
        height = self.svg.unittouu(self.svg.get('height'))

        with open(py_file, 'w') as fhl:
            self.generate_script(fhl, width, height, iccPath)
        call(SCRIBUS_EXE, '-g', '-py', py_file, svg_file, pdf_file)
        with open(pdf_file, 'rb') as fhl:
            stream.write(fhl.read())

if __name__ == '__main__':
    Scribus().run()

