#!/usr/bin/env ruby
# encoding: UTF-8
# coding: UTF-8

require 'fileutils'

Encoding.default_internal = Encoding::UTF_8

# Obtiene los contenidos para unirlos
def create_content entries, file_name
  content = []
  final = file_name == 'entrada_editada.md' ? 'todo.md' : 'notas.md'

  entries.each do |e|
    file = e + '/' + file_name

    if File.exist?(file)
      if file_name == 'entrada_editada.md'
        content.push('<section epub:type="chapter" role="doc-chapter">')
      end

      content.push("\n" + File.read(file))

      if file_name == 'entrada_editada.md'
        content.push('</section>')
      end
    end
  end

  file_new = File.new(final, 'w:UTF-8')
  file_new.puts content
  file_new.close
end

# Modifica enlaces del id de la entrada a su nombre XHTML final
def change_urls urls, file_name
  file = File.read(file_name)

  urls.each do |u|
    file.gsub!("@index[#{u.to_i - 2}]", u)
  end

  file_new = File.new(file_name, 'w:UTF-8')
  file_new.puts file
  file_new.close
end

# Da la fecha como se quiere
def fecha_formato
    f = Time.now.to_s.split(' ')[0].split('-')

    def dia d
        return d.to_i.to_s
    end

    def mes m
        m = m.to_i

        if    m == 1
            'enero'
        elsif m == 2
            'febrero'
        elsif m == 3
            'marzo'
        elsif m == 4
            'abril'
        elsif m == 5
            'mayo'
        elsif m == 6 
            'junio'
        elsif m == 7
            'julio'
        elsif m == 8
            'agosto'
        elsif m == 9
            'septiembre'
        elsif m == 10
            'octubre'
        elsif m == 11
            'noviembre'
        else  m == 12
            'diciembre'
        end
    end

    return dia(f[2]) + ' de ' + mes(f[1]) + ' del ' + f[0]
end

# Variables
epub_nombre                 = 'edicion_digital_como_metodologia_para_una_edicion_global'
coletilla                   = '_3-0-0.epub'
epub_nombre_predeterminado  = ''
fecha                       = fecha_formato
legal_nombre                = '002-legal.xhtml'
css_nombre                  = 'styles.css'
nav_nombre                  = 'nav.xhtml'
html_nombre                 = 'index.html'
entries                     = []
content_main                = []
content_note                = []
urls                        = []
css_contenido               = []
legal_contenido             = []
legal_contenido_recortado   = []
css_contenido               = []
nav_contenido               = []
html_template               = []

# Va a la raíz
Dir.chdir(File.dirname(__FILE__))

# Obtiene las rutas de todas las entradas
Dir.glob('*').each do |d|
  if d.to_i != 0 then entries.push(File.absolute_path(d)) end
end
entries.sort!

# Une los contenidos
puts "Uniendo contenidos…\n\n"
Dir.chdir('ebooks/recursos/archivos-madre/md')
create_content(entries, 'entrada_editada.md')
create_content(entries, 'notas.md')

# Obtiene los nombres de archivos
puts "Obteniendo nombres de los archivos XHTML…"
system("pc-pandog -i todo.md -o borrar.xhtml")
system("pc-divider -f borrar.xhtml --section")

Dir.glob('*.xhtml').each do |x|
  if x.to_i != 0 then urls.push(x) end
  FileUtils.rm(x)
end
urls.sort!

# Modificación de enlaces
puts "Añadiendo enlaces internos…\n\n"
change_urls(urls, 'todo.md')
change_urls(urls, 'notas.md')

# Va a la legal
puts "Poniendo fecha a la legal…\n\n"
Dir.chdir('../xhtml')

# Coloca la fecha a la legal
legal = File.open(legal_nombre, 'r:UTF-8')
legal.each do |linea|
    if linea =~ /id="fecha"/
        linea = linea.gsub(/^(.*?>).*?(<.*)$/, '\1' + fecha + '\2')
    end
    legal_contenido.push(linea)
end
legal.close
legal = File.new(legal_nombre, 'w:UTF-8')
legal.puts legal_contenido
legal.close

# Va a la hoja de estilos
Dir.chdir('../css')

# Incluye la hoja de estilos actualizada
FileUtils.rm('styles.css')
system("pc-add --add css")

# Coloca los elementos adicionales a la hoja de estilos
css = File.open(css_nombre, 'r:UTF-8')
css.each do |linea|
    if linea =~ /Estilos de esta edición/

        # Obtiene los elementos adicionales de la hoja de estilos
        css_extra = File.open('styles-extra.css', 'r:UTF-8')
        css_extra.each do |l|
            css_contenido.push(l)
        end
        css_extra.close

        break
    end
    css_contenido.push(linea)
end
css.close
css = File.new(css_nombre, 'w:UTF-8')
css.puts css_contenido
css.close

# Va al proyecto automata
Dir.chdir('../../epub-automata')

# Crea los EPUB y el MOBI
system("pc-automata -f ../archivos-madre/md/todo.md -n ../archivos-madre/md/notas.md -c ../archivos-madre/img/portada.jpg -i ../archivos-madre/img/ -s ../archivos-madre/css/styles.css -x ../archivos-madre/xhtml/ --depth 2 --section --reset --with-indexes --two-columns --compress --no-alphabet --overwrite")

# Cambia los nombres y mueve los archivos, excepto del EPUB 3.0.0
Dir.glob('*.*').each do |e|
    if (File.extname(e) == '.epub' || File.extname(e) == '.mobi') && e !~ /#{coletilla}/
        File.rename(e, epub_nombre + File.extname(e))
        FileUtils.mv(epub_nombre + File.extname(e), '../..')

        # Obtiene el nombre por defecto del epub
        if File.extname(e) == '.epub' then epub_nombre_predeterminado = File.basename(e,'.*') end
    end
end

# Cambia el nombre y mueve el EPUB 3.0.0
File.rename(epub_nombre_predeterminado + coletilla, epub_nombre + coletilla)
FileUtils.mv(epub_nombre + coletilla, '../..')

# Se va al directorio donde están los libros
Dir.chdir('../..')

# Se firman los libros
Dir.glob('*.*').each do |e|
    if File.extname(e) == '.epub' || File.extname(e) == '.mobi'
        system("gpg --output #{e}.sig --detach-sig #{e}")
    end
end

# Empieza la creación del sitio
puts "\nRecreando el sitio…"

# Reduce el contenido a lo que se pondrá en el sitio
freno = true
legal_contenido.each do |linea|
    # Evita agarrar todo después de </section>
    if linea =~ /^\s+<\/section/ then freno = true end

    if !freno && linea !~ /Los textos que componen/ then legal_contenido_recortado.push('    ' + linea.gsub("\n",'').gsub('../img/logo','ebooks/recursos/archivos-madre/img/logo')) end

    # Permita agarrar a partir de la fecha
    if linea =~ /id="fecha"/ then freno = false end
end

# Regresa a la raíz
Dir.chdir('..')

# Recrea el archivo CSS para el sitio, adoptando los estilos del libro más otros adicionales
css = File.open('ebooks/recursos/archivos-madre/css/' + css_nombre, 'r:UTF-8')
css.each do |linea|
    css_contenido.push(linea)
end
css.close
css = File.open('site-src/templates/' + css_nombre, 'r:UTF-8')
css.each do |linea|
    css_contenido.push(linea)
end
css.close
css = File.new('site-src/css/' + css_nombre, 'w:UTF-8')
css.puts css_contenido
css.close

# Obtiene solo lo necesario del nav
nav_contenido.push('                <ol>')
urls.each do |u|
  file = File.read('ebooks/recursos/epub-automata/epub/OPS/xhtml/' + u)
  file.gsub!("\n", '')
  file.gsub!(/^.*?(<h1.*?<\/h1>).*$/, '\1')
  file.gsub!(/<(.{0,1})h1/, '<' + '\1' + 'li')
  file.gsub!(/<li[^>]*?>\d+\.\s+/, '<li>')
  nav_contenido.push('                  ' + file)
end
nav_contenido.push('                </ol>')
nav_contenido.push('                <style>div > ol {list-style: decimal;}</style>')

# Obtiene la plantilla HTML
html = File.open('site-src/templates/' + html_nombre, 'r:UTF-8')
html.each do |linea|
    # Cambia los elementos del nav, legal y fecha
    html_template.push(linea.gsub(/\s+<!--nav-->/, nav_contenido.join("\n")).gsub(/\s+<!--legal-->/, legal_contenido_recortado.join("\n")).gsub('<!--fecha-->', fecha))
end
html.close

# Crea el sitio
html = File.new(html_nombre, 'w:UTF-8')
html.puts html_template
html.close