#!/usr/bin/ruby

#    parser exportů dat návštěvních knih od blueboardu do SQL insertů
#    ----------------------------------------------------------------
#    Copyright (C) 2008  Karel Čížek (http://k47.cz)
#
#    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


#    -info:
#    parser exportů dat návštěvních knih od blueboardu do SQL insertů
#    prochází textový soubor jehož cesta je zadaná jako parametr a získává zprávy z exportu
#    poradí si s odpovědmi na příspěvky a sestupně přiřazuje vzkazům id, 
#    to znamená, že nejstarší vzkaz má nejnižší id (jen u odpovědí je to opačně)
 

$pocet = 1

soubor = ARGV[0]

if !File.exist?(soubor)
  puts 'spatne jmeno souboru'
  exit(1)
end 


class Vzkaz
  
  def initialize()
    @id = -1
    @nick = ''
    @mail = ''
    @web = ''
    @cas = ''
    @vzkaz = ''
    @odpoved_na = -1
    $pocet += 1
  end
  
  def get_id
    return $pocet - @id.to_i 
  end
  
  def get_vzkaz
    return ( @odpoved_na == -1 ? @vzkaz : "[#{$pocet - @odpoved_na.to_i}] " + @vzkaz )
  end
  
  def to_s
    return "INSERT INTO kniha (mail, web, nick, id, cas, vzkaz) VALUES ('#{@mail}', '#{@web}', '#{@nick}', #{get_id}, '#{@cas}', '#{get_vzkaz}');"
  end
  
  attr_reader :id, :nick, :mail, :web, :cas, :vzkaz, :odpoved_na
  attr_writer :id, :nick, :mail, :web, :cas, :vzkaz, :odpoved_na
  
end


f = File.open(soubor, 'r+')

Delimiter = '-----------------------------------------'

p = f.readlines


vzkazy = []
cislo_radku = 1
id = 0

odpoved = false


p.each {
  |radek| 
  
  cislo_radku += 1
  
  if(radek =~ /#{Delimiter}/)
    
    #osetreni, když nasledoval velony radek a byla zapocata odpoved
    if odpoved == true && vzkazy.last.nick.empty?
      vzkazy.pop
    end
    
    id += 1
    vzkazy.push(Vzkaz.new)
    vzkazy.last.id = id
    
    cislo_radku = 1
    odpoved = false
  else
    
    if odpoved
      
      
      case cislo_radku
      when 2
        #nick, datum
        
        if radek.chop =~ /^.*? - (.*) \((\d\d?). (\d\d?). (\d\d\d\d) (\d\d):(\d\d)\)/
          vzkazy.last.nick = $1
          vzkazy.last.cas =  $4 + '-' + ($3.length == 1 ? '0' + $3 : $3) + '-' + ($2.length == 1 ? '0' + $2 : $2) + ' ' + $5 + ':' + $6
        end
        
      when 3
	#nic
      else
        #vzkaz
        vzkazy.last.vzkaz += radek.chop.sub(/<\/p><p>/, '<br /> ')
      end
      
      
    else

      
      case cislo_radku
      when 2
      
        if radek.chop =~ /^(.*?) (\((.*@.*)\))? *?((\d\d?). (\d\d?). (\d\d\d\d) (\d\d):(\d\d))/
          vzkazy.last.nick = $1
          vzkazy.last.mail = $3
          vzkazy.last.cas =  $7 + '-' + ($6.length == 1 ? '0' + $6 : $6) + '-' + ($5.length == 1 ? '0' + $5 : $5) + ' ' + $8 + ':' + $9
        end

        #nick (mail) datum

      when 3
        #web
        vzkazy.last.web = radek.chop
      when 4
        #nil
      else
        #zprava nebo odpoved
        
        if radek.chop.empty?
          #oddelovac pred odpovedi
          #novy vzkaz
          odpoved = true
          vzkazy.last.id
          vzkazy.push(Vzkaz.new)
          vzkazy.last.odpoved_na = id
          id += 1
          vzkazy.last.id = id
          cislo_radku = 1
        else
          vzkazy.last.vzkaz += radek.chop.sub(/<\/p><p>/, '<br /> ')
        end
      end    
    
      
    end
    


  end
  
}

vzkazy.each { |item| puts item.to_s }
#puts $pocet
