#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# autolatex/utils/runner_command.py
# Copyright (C) 2013  Stephane Galland <[email protected]>
#
# 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; see the file COPYING.  If not, write to
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.

import os
import sublime
import utils, runner
import gettext

#---------------------------------
# INTERNATIONALIZATION
#---------------------------------

_T = gettext.gettext


class AbstractRunnerCommand(runner.Listener):

       def __init__(self):
               runner.Listener.__init__(self)
               self._thread = None
               self._show_progress = True

       def cancel_task(self):
               if self._thread:
                               self._thread.cancel()

       def start_task(self, show_progress, encoding, working_dir, directive, params):
               self._encoding = encoding
               self._show_progress = show_progress

               # Default the to the current files directory if no working directory was given
               if (working_dir == "" and self.window.active_view()
                               and self.window.active_view().file_name()):
                   working_dir = os.path.dirname(self.window.active_view().file_name())

               if not hasattr(self, 'output_view'):
                   # Try not to call get_output_panel until the regexes are assigned
                   self.output_view = self.window.get_output_panel("autolatex")

               self.output_view.settings().set("result_file_regex", "^(.*?):([0-9]+):(?:([0-9]+):)?\\s*(.*?)\\s*$")
               self.output_view.settings().set("result_line_regex", "^l\\.([0-9]+)\\s+")
               self.output_view.settings().set("result_base_dir", working_dir)

               # Call get_output_panel a second time after assigning the above
               # settings, so that it'll be picked up as a result buffer
               self.window.get_output_panel("autolatex")

               # Show the progress
               if self._show_progress:
                       sublime.status_message(_T("Building [%d%%]") % int(0))

               autolatex_directory = utils.find_AutoLaTeX_directory(working_dir)
               self._thread = runner.Runner(
                               self,
                               autolatex_directory,
                               directive,
                               params)
               self._thread.start()


       def get_runner_progress(self):
               return self._show_progress

       def on_runner_add_ui(self):
               sublime.status_message(_T("Building [%d%%]") % 0)
               show_panel_on_build = sublime.load_settings("Preferences.sublime-settings").get("show_panel_on_build", True)
               if show_panel_on_build:
                       self.window.run_command("show_panel", {"panel": "output.autolatex"})

       def on_runner_remove_ui(self):
               pass

       def on_runner_progress(self, amount, comment):
               if comment:
                       sublime.status_message(_T("Building [%d%%]: %s") % (int(amount * 100), comment))
               else:
                       sublime.status_message(_T("Building [%d%%]") % int(amount * 100))

       def on_runner_finalize_execution(self, retcode, output, latex_warnings):
               messages = []
               if retcode != 0:
                       messages.append(output)
               else:
                       for warning in latex_warnings:
                               messages.append(warning[1]+":1: "+warning[0])

               for message in messages:
                       try:
                           message = message.decode(self._encoding)
                       except:
                           message = _T("[Decode error - output not %s]") % self._encoding

                       # Normalize newlines, Sublime Text always uses a single \n separator
                       # in memory.
                       message = message.replace('\r\n', '\n').replace('\r', '\n')

                       selection_was_at_end = (len(self.output_view.sel()) == 1
                           and self.output_view.sel()[0]
                               == sublime.Region(self.output_view.size()))

                       self.output_view.set_read_only(False)
                       edit = self.output_view.begin_edit()
                       self.output_view.insert(edit, self.output_view.size(), message)
                       if selection_was_at_end:
                           self.output_view.show(self.output_view.size())
                       self.output_view.end_edit(edit)
                       self.output_view.set_read_only(True)

               if retcode!=0:
                   sublime.status_message(_T("Build finished with an error"))
               elif len(latex_warnings) == 0:
                   sublime.status_message(_T("Build finished"))
               else:
                   sublime.status_message(_T("Build finished with %d warnings") % len(latex_warnings))

               # Set the selection to the start, so that next_result will work as expected
               edit = self.output_view.begin_edit()
               self.output_view.sel().clear()
               self.output_view.sel().add(sublime.Region(0))
               self.output_view.end_edit(edit)