module Softcover
  class Builder
    include Softcover::Utils

    attr_accessor :manifest, :built_files

    def initialize
      @manifest = Softcover::BookManifest.new(verify_paths: true,
                                              source: source)
      @built_files = []
      ensure_style_file_locations
      write_polytexnic_commands_file
      write_language_customization_file
    end

    def build!(options={})
      setup
      build(options)
      verify
      self
    end

    def clean!; end

    private
      def setup; end
      def verify; end

      # Ensures the style files are in the right location.
      # This is for backwards compatibility.
      def ensure_style_file_locations
        styles_dir = Softcover::Directories::STYLES
        mkdir styles_dir
        fix_custom_include
        files = Dir.glob('*.sty')
        FileUtils.mv(files, styles_dir)
      end

      # Fixes the custom include.
      # The template includes the custom style file as an example
      # of file inclusion. Unfortunately, the location of 'custom.sty', has
      # changed, which will result in older templates spontaneously breaking.
      def fix_custom_include
        first_chapter = File.join('chapters', 'a_chapter.tex')
        if File.exist?(first_chapter)
          text = File.read(first_chapter)
          text.gsub!('<<(custom.sty',
                     "<<(#{Softcover::Directories::STYLES}/custom.sty" )
          File.write(first_chapter, text)
        end
      end

      # Writes out the PolyTeXnic commands from polytexnic.
      def write_polytexnic_commands_file
        Polytexnic.write_polytexnic_style_file(styles_dir)
      end

      def write_language_customization_file
        filename = File.join(styles_dir, 'language_customization.sty')
        contents = listing_customization
        File.write(filename, contents)
      end

      def styles_dir
        File.join(Dir.pwd, Softcover::Directories::STYLES)
      end


      def listing_customization
        listing = language_labels["listing"].downcase
        box     = language_labels["aside"]
        <<-EOS
% Aside box label
\\renewcommand{\\boxlabel}{#{box}}

% Codelisting captions
\\usepackage[hypcap=false]{caption}
\\DeclareCaptionFormat{#{listing}}{\\hspace{-0.2em}\\colorbox[gray]{.85}{\\hspace{0.1em}\\parbox{0.997\\textwidth}{#1#2#3}}\\vspace{-1.3\\baselineskip}}
\\captionsetup[#{listing}]{format=#{listing},labelfont=bf,skip=16pt,font={rm,normalsize}}
\\DeclareCaptionType{#{listing}}
\\newcommand{\\codecaption}[1]{\\captionof{#{listing}}{#1}}
        EOS
      end

  end
end