#! /usr/bin/ruby
# coding: utf-8

# 2024 年度 INEX シェルスクリプト課題  ruby バージョン解答
# 履歴
# (2025-05-06 石渡) 作成
# (2025-07-02 石渡) 修正

# このスクリプトは ホームディレクトリ直下に配置すること

require "fileutils"
require "csv"

# 変数設定
WORKDIR = "work"
MAILDIR = "Maildir"
SPAMDIR = "SPAM"
SRCDIR = "src"
file_mailbox = "Mailbox"


# 1. work/ ディレクトリ作成・ディレクトリ移動
Dir.mkdir(WORKDIR) unless FileTest.exist?(WORKDIR)
Dir.chdir(WORKDIR)

# 2. src/ ディレクトリ作成・ディレクトリ移動
Dir.mkdir(SRCDIR) unless FileTest.exist?(SRCDIR)

# 3. Mailbox.tar.gz の取得, 解凍
system("cp /kadai/Mailbox.tar.gz #{SRCDIR}")
system("tar xzf #{SRCDIR}/Mailbox.tar.gz")

# 4. sender.csv の作成
lines=[]
File.open(file_mailbox,mode="rt") {|file|  # file を open,
  file.each_line{|line|
    lines.push(line)
  }
}

# mails[i][j]  i はメールの通し番号. 0 からスタート
mails = Hash.new
senders = []

number_of_mail = 0
lines.each do |line|
  if line.include?('From ') then
    number_of_mail = number_of_mail + 1
    mails[number_of_mail-1] = []
  end
  mails[number_of_mail-1] << line
end

# 送り主のリストを作成. senders[i] i はメールの通し番号. 0 からスタート
for i in 1..number_of_mail do
  senders.push(mails[i-1][0].split(' ')[1])
end

# From の種類とその数を数える
counts = senders.tally

# sender.csv の作成
CSV.open("sender.csv", "w") do |csv|
  csv << ["ALL", number_of_mail]
  counts.each do |key, value|
    csv << [key, value]
  end
end

# 5. Maildir/ ディレクトリの作成
Dir.mkdir(MAILDIR) unless FileTest.exist?(MAILDIR)

(1..number_of_mail).each do |i|
  filename = "#{MAILDIR}/mail%04d" % i  # %04d で4桁ゼロ埋め
  File.open(filename, "w") do |f|
    f.puts mails[i]
  end
end

# 6. SPAM/ ディレクトリの作成
Dir.mkdir(SPAMDIR) unless FileTest.exist?(SPAMDIR)

number_of_spam = 0

(1..number_of_mail).each do |i|
  from_colon = mails[i-1].select { |item| item.include?("From: ") }[0].split(' ')[1]
  unless from_colon == senders[i-1]
    number_of_spam = number_of_spam + 1
    spamfilename = "#{SPAMDIR}/spam%04d" % number_of_spam  # %04d で4桁ゼロ埋め
    mailfilename = "#{MAILDIR}/mail%04d" % i
    system("mv #{mailfilename} #{spamfilename}")
  end
end

exit


