#!/usr/bin/ruby
# Copyright (c) 2010, Takaya Kakizaki(kacky)
# All rights reserved.
#
#  ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。 
#
#  ・ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。 
#
#  ・バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。 
#
#  ・書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、オープン麻雀の名前またはコントリビューターの名前を使用してはならない。
#
#
#  本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、
#  商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。
#  著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか
#  （過失その他の）不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した
#  （代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない）
#  直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。 
require "comrexml"
require "kconv"
require "mahjongconst"

PAI_A = ["東","南","西","北","白","発","中"]

def getpainame(num)
  n = (num % 9) + 1
  
  if num < 9
    return "#{n}m"
  elsif num < 18
    return "#{n}p"
  elsif num < 27
    return "#{n}s"
  else
    return PAI_A[num-27]
  end
end


def mjscoreconv(iname,fd)
  # IDを東風荘形式へ変換
  idtable = [0,0,0,0]
  ifd = File.open(iname,File::RDWR)
  
  scoredata = ifd.readline
  
  ifd.close
  
  # ログが最後(</log>)まで到達していない場合は局の最後に合わせる
  if !scoredata.rindex("</log>")
    scoredata = scoredata.slice(0,scoredata.rindex("</kyoku>") + 8)
    scoredata += "</log>"
  end
  
  tmp = iname.split("_")
  
  tid = tmp[0]
  date = tmp[1]
  suffix = tmp[2]
  
  year = date[0..3]
  month = date[4..5]
  day = date[6..7]
  hour = date[8..9]
  minute = date[10..11]
  
  
  # XMLとしてパースする
  doc = CommonXML::parseXML(scoredata)
  
  ele = doc.getRoot
  
  fd.puts("===== 東南戦：ランキング卓 #{tid}卓 開始 #{year}/#{month}/#{day} #{hour}:#{minute} =====")
  is_first = true
  kyoku_a = ["東1局","東2局","東3局","東4局","南1局","南2局","南3局","南4局"]
  mangan_a = ["満貫","ハネ満","倍満","三倍満","役満"]
  han_a = ["一","二","三","四","五"]
  
  ele.each_element("kyoku") { | item |
    # id順にソート
    member_a = []
    item.each_element("#{TAG_MEMBER}/") { | member |
      id = member.findFirstElement("#{TAG_PLAYER}/#{TAG_ID}")
      member_a[id.text.to_i] = member
    }
    
    if is_first
      fd.write("  持点25000")
      
      for i in 0 .. member_a.length-1
        zikaze = member_a[i].findFirstElement(TAG_ZIKAZE).text.to_i
        idtable[zikaze-1] = i
      end
      
      for i in 0 .. member_a.length-1
        nm = member_a[idtable[i]].findFirstElement("#{TAG_PLAYER}/#{TAG_NAME}")
        fd.write(" [#{i+1}]#{nm.text.tosjis}_#{i+1} R1500")
      end
      
      fd.puts
      is_first = false
    end
    
    kc = kyoku_a[item.findFirstElement(TAG_KYOKUCOUNT).text.to_i]
    rb = item.findFirstElement(TAG_RIICHIBOU).text
    tb = item.findFirstElement(TAG_TSUMIBOU).text
    
    fd.write("  #{kc} #{tb}本場(リーチ#{rb})")
    
    res = item.findFirstElement(TAG_RESULT)
    
    res.each_element(TAG_PLAYER) { | player |
      score = player.findFirstElement(TAG_POINT).text.to_i
      nm = player.findFirstElement(TAG_NAME)
      id = idtable.index(player.findFirstElement(TAG_ID).text.to_i)
      if score != 0
        fd.write(" #{nm.text.tosjis}_#{id+1} #{score}")
      end
    }
    
    fd.puts
    
    tmp = res.findFirstElement(TAG_MANGAN)
    
    if tmp
      mangan = tmp.text.to_i - 1
    else
      mangan = -1
    end
    
    if res.findFirstElement("ronagari") || res.findFirstElement("tsumoagari")
      if mangan >= 0
        fd.write("    #{mangan_a[mangan]}")
      else
        han = res.findFirstElement(TAG_HAN).text.to_i
        fu = res.findFirstElement(TAG_FU).text.to_i
        
        fd.write("    #{fu}符 #{han_a[han-1]}飜")
        if res.findFirstElement("ronagari")
          fd.write("ロン")
        else
          fd.write("ツモ")
        end
        
      end
      
    else
      fd.write("   ")
    end
    
    yaku = res.findFirstElement(TAG_YAKU)
    fd.puts(" #{yaku.text.tosjis.gsub(/ドラ /,"ドラ")}")
    
    # 配牌の表示
    
    for i in 0 .. member_a.length-1
      id = idtable[i]
      zikaze = member_a[id].findFirstElement(TAG_ZIKAZE).text.to_i
      fd.write("    [#{i+1}#{PAI_A[zikaze-1]}]")
      member_a[id].each_element("#{TAG_TEHAI}/#{TAG_PAI}/num") { | pai |
        num = pai.text.to_i
        fd.write(getpainame(num))
      }
      fd.puts
    end
    
    # ドラの表示
    fd.write("    [表\ドラ]")
    
    item.each_element("#{TAG_RESULT}/#{TAG_DORA}/#{TAG_PAI}/num") { | dora |
      fd.write(getpainame(dora.text.to_i))
    }
    
    fd.write(" [裏ドラ]")
    
    item.each_element("#{TAG_RESULT}/#{TAG_URADORA}/#{TAG_PAI}/num") { | dora |
      fd.write(getpainame(dora.text.to_i))
    }
    
    fd.puts
    
    evcount = 0
    
    # イベントの表示
    ev = item.findFirstElement("tsumo")
    
    while ev
      if evcount == 0
        fd.write("    *")
      end
      
      plid = ev.findFirstElement("#{TAG_PLAYER}/id")
      if plid
        plid = idtable.index(plid.text.to_i) + 1
      end
      
      paiid = ev.findFirstElement("#{TAG_PAI}/num")
      if paiid
        paiid = paiid.text.to_i
      end
      
      tsumogiri = ev.findFirstElement("#{TAG_PAI}/#{TAG_TSUMOGIRI}")
      if tsumogiri
        tsumogiri = eval(tsumogiri.text)
      else
        tsumogiri = false
      end
      
      mentsu = []
      mid = ev.each_element("#{TAG_MENTSU}/#{TAG_PAI}/num") { | pnum |
        mentsu << pnum.text.to_i
      }
      
      mentsu -= [paiid]
      
      case ev.getTagName
      when "tsumo"
        fd.write(" #{plid}G#{getpainame(paiid)}")
      when "ev"
        evid = ev.findFirstElement("id")
        case evid.text.to_i
        when ID_DAHAI .. ID_DAHAI + 13
          fd.write(" #{plid}#{tsumogiri ? "D" : "d"}#{getpainame(paiid)}")
        when ID_TII .. ID_PON - 1
          fd.write(" #{plid}C")
          for p in mentsu
            fd.write("#{getpainame(p)}")
          end
        when ID_PON .. ID_DAIMINKAN - 1
          fd.write(" #{plid}N")
        when ID_DAIMINKAN,ID_KAN .. ID_RIICHI - 1
          fd.write(" #{plid}K#{getpainame(paiid)}")
        when ID_RIICHI .. ID_RIICHI + 13
          fd.write(" #{plid}R")
          fd.write(" #{plid}#{tsumogiri ? "D" : "d"}#{getpainame(paiid)}")
        when ID_TSUMO,ID_RON
          fd.write(" #{plid}A")
        end
      else
        break
      end
      
      ev = ev.getNextSibling
      evcount = (evcount + 1) % 15
      
      if evcount == 0
        fd.puts
      end
      
    end
    
    fd.puts
  }
end

if ARGV[0]
  fd = File.open("mjscore.txt",File::WRONLY | File::CREAT | File::TRUNC)
  mjscoreconv(ARGV[0],fd)
  fd.close
else
  require "cgi"
  cgi = CGI.new
  puts "Content-type:text/plain;charset=shift-jis"
  puts
  mjscoreconv(cgi["file"],STDOUT)
end

