require 'csv'
require 'prawn'

points = Hash.new(0)
badges = Hash.new{ |hash, key| hash[key] = []}
entries = Hash.new(0)# データ入力回数を管理

def add_points(member_name, points,badges, additional_points, entries)
  points[member_name] += additional_points
  entries[member_name] += 1
  check_for_badges(member_name, points, badges, entries)
end

def check_for_badges(member_name, points, badges, entries)
  if points[member_name] >= 10 && !badges[member_name].include?("ビギナー!")
    badges[member_name] << "ビギナー!"
    puts "おめでとう!! #{member_name}がバッジ『ビギナー!』を獲得しました!"
  end
  if points[member_name] >= 20 && !badges[member_name].include?("熟練記録者")
    badges[member_name] << "熟練記録者"
    puts "スゴーイ!!ｵｵー#{member_name}がバッジ『熟練記録者』を獲得しました!まだいけるよね……?ﾐﾃﾙﾖ…"
  end
  if entries[member_name] >= 7 && !badges[member_name].include?("継続記録者")
    badges[member_name] << "継続記録者"
    puts "素晴らしい!!ﾜｰｵ#{member_name}がバッジ『継続記録者』を獲得しました!"
  end
  if entries[member_name] >= 30 && !badges[member_name].include?("マイルストーン達成者")
    badges[member_name] << "マイルストーン達成者"
    puts "お見事!!!ｴｴｴｴｰｽｺﾞｰ #{member_name}がバッジ『マイルストーン達成者』を獲得しました!これからも健康に生活しよう!!!"
  end
end

def save_health_data(member_name, date, weight, blood_pressure, note, steps, sleep_hours)
  CSV.open('health_records.csv', 'a') do |csv|
    csv << [member_name, date, weight || " ", blood_pressure || " ", note, steps || " ", sleep_hours || " "]
  end
end

def get_health_data(member_name)
  data = {}

  print"日付を入力してね (例:2024-10-15):"
  data[:date] = gets.chomp

  print"体重を入力してね (kg)"
  weight_input = gets.chomp
  data[:weight] = weight_input.empty? ? nil : weight_input.to_f
  
  print"血圧を入力してね (例: 120\80):"
  data[:blood_pressure] = gets.chomp
  
  print"気づいたことや変化を記録してね (任意):"
  data[:note] = gets.chomp
  
  print "昨日の万歩計の歩数を入れてね:"
  steps_input = gets.chomp
  data[:steps] = steps_input.empty? ? nil : steps_input.to_i
  
  print "昨日の睡眠時間を入力してね (時間): "
  sleep_hours_input = gets.chomp
  data[:sleep_hours] = sleep_hours_input.empty? ? nil : sleep_hours_input.to_f
  
  data.merge(member_name: member_name)
end

def display_family_data
  puts"家族全員の健康観察記録:"
  CSV.foreach('health_records.csv',headers: true) do |row|
    puts "メンバー: #{row['Member']}, 日付: #{row['Date']}, 体重: #{row['Weight']}kg, 血圧: #{row['Blood Pressure']}, メモ: #{row['Note']}, 歩数: #{row['Steps']}, 睡眠時間: #{row['Sleep Hours']}時間"
  end
end

def create_pdf_report_for_member(member_name)
  health_data = []
  CSV.foreach('health_records.csv', headers: true) do |row|
    if row['Member'] == member_name
      health_data << { date: row['Date'], weight: row['Weight'], blood_perssure: row['Blood Perss'], note: row['Note'], steps: row['steps'], sleep_hours: row['Sleep Hours'] }
    end
  end

  health_data.sort_by! { |record| record[:date] }

  Prawn::Document.generate("#{member_name}_health_report.pdf") do |pdf|
    pdf.text "#{member_name}の健康レポート", size: 30, style: :bold
    pdf.move_down 20
    font 'ipaexm.ttf'
    
    health_data.each do |record|
      pdf.text "日付: #{record[:date]}"
      pdf.text "体重: #{record[:weight]}kg"
      pdf.text "血圧: #{record[:blood_pressure]}"
      pdf.text "メモ: #{record[:note]}"
      pdf.text "歩数: #{record[:steps]}"
      pdf.text "睡眠時間: #{record[:sleep_hours]}"
      pdf.move_down 10
    end
  end
end
# メインプログラムループ
loop do
  puts "1: 健康データを入力する"
  puts "2: 健康データを表示する"
  puts "3: ポイントとバッジを確認する"
  puts "4: 家族全員のリーダーボードを表示する"
  puts "5: PDFレポートを生成する"
  puts "6: 終了する"
  choice = gets.chomp.to_i

  case choice
  when 1
    puts "データを入力するメンバーを選んでください: おばあちゃん, お父さん, お母さん, まおこ, とわこ"
    member_name = gets.chomp
    data = get_health_data(member_name)
    save_health_data(data[:member_name], data[:date], data[:weight], data[:blood_pressure], data[:note], data[:steps], data[:sleep_hours])
    add_points(member_name,points,badges,10,entries)
    puts "薬のんだ?忘れないで飲んでね!"
  when 2
    display_family_data
  when 3
    points.each do |member_name, point|
      puts "#{member_name}のポイント: #{point}"
      puts "#{member_name}の取得したバッジ: #{badges[member_name].join(',')}"
    end
  when 4
    puts "家族全員のリーダーボード:"
    points.sort_by {|_, point| -point }.each do |member_name, point|
      puts "#{member_name}: #{point} ポイント"
    end
  when 5
    puts "PDFレポートを生成するメンバーを選んでください: おばあちゃん, お父さん, お母さん, まおこ, とわこ"
    member_name = gets.chomp
    create_pdf_report_for_member(member_name)
    puts "PDFレポートが作成されました: #{member_name}_health_report.pdf"
  when 6
    puts "今日も一日楽しく過ごそう!ｲｴｰｲ!"
    break
  else
    puts "無効な選択です。もう一度試してください。"
  end
end
