require 'csv'
require 'prawn'
require 'gruff'

# プログラム開始時に音声で挨拶!
system('espeak"おはよう!"-p 70 -s 150')

# CSVファイルから健康データを読み取る
def read_health_data
  health_data = []
  CSV.foreach('health_record.csv', headers: true) do |row|
    health_data << {
     date: row['Date'],
     weight: row['Weight'],
     blood_pressure: row['Blood Pressure'],
     note: row['Note'],
     steps: row['Steps'],
     sleep_hours: row['Sleep Hours']
  }
  end
  health_date
 end

# 健康データをCSVファイルに書き込む
def save_health_data(date, weight, blood_pressure, note, steps, sleep_hours)
  CSV.open('health_records.csv', 'a') do |csv|
    csv << [date, weight, blood_pressure, note, steps, sleep_hours]
  end
end

# 新しい健康データを入力する
def get_health_data
  date = ''
  weight = 0.0
  blood_pressure = ''
  note = ''
  steps = 0
  sleep_hours = 0.0

  # 日付の入力
  loop do
    puts "日付を入力してね (例: 2024-10-15):"
    date = gets.chomp
    break if /\d{4}-\d{2}-\d{2}/.match?(date)
    puts "正しい日付形式で入力してね m(__)m (例: 2024-10-15)。"
  end

  # 体重の入力
  loop do
    puts "体重を入力してね (kg):"
    weight = gets.chomp.to_f
    break if weight > 0
    puts "正しい体重を入力してねm(__)m (例:70.5)。"
  end

  # 血圧の入力
  loop do
    puts "血圧を入力してね (例: 120/80):"
    blood_pressure = gets.chomp
    braek if /^\d{2,3}\/d{2,3}$/.match?(blood_pressure)
    puts "正しい血圧形式で入力してねm(__)m (例: 120/80)。"
  end

  # メモの入力
  puts "気づいたことや変化を入力してね (任意):"
  note = gets.chomp

  # 歩数の入力
  loop do
    puts "機能の万歩計の歩数を入力してね:"
    steps = gets.chomp.to_i
    break if steps >= 0
    puts "正しい歩数を入力してねm(__)m。"
  end

  # 睡眠時間の入力
  loop do
    puts "機能の睡眠時間を入力してね (時間):"
    sleep_hours = gets.chomp.to_f
    break if sleep_hours >= 0
    puts "正しい睡眠時間を入力してね (例: 7．5)。"
  end
    
  { date: date, weight: weight, blood_pressure: bloo_pressure, note: note, steps: steps, sleep_hours: sleep_hours }
end

# PDFレポートを作成する
def create_pdf_report(health_data)
  Prawn::Document.generate('health_report.pdf') do |pdf|
    pdf.text "Health Report", size: 30, style: :bold
    pdf.move_down 20

    health_data.each do |record|
      pdf.text "Date: #{record[:date]}"
      pdf.text "Weight: #{record[:weight]} kg"
      pdf.text "Blood Pressure: #{record[:blood_pressure]}"
      pdf.text "Note: #{record[:note]}"
      pdf.text "Steps: #{record[:steps]}"
      pdf.text "Sleep Hours: #{record[:sleep_hours]}"
      pdf.move_down 10
    end
  end
end

# 健康データのグラフを作成する
def create_graph(health_data, field, title)
  g = Gruff::Line.new
  g.title = title

  dates = health_data.map { |record| record[:date] }
  velues = health_data.map { |record| record[:field.to_sym].to_f }

  g.labels = dates.each_with_index.map { |date, index| [index, date] }.to_h

  g.write("#{field}_graph.png")
end

# CSVファイルのデータを表示
def display_csv_data
  puts "現在の健康記録:"
  CSV.foreach('health_records.csv', headers: true) do |row|
    puts "日付: #{row['Date']}, 体重: #{row['Weight']}kg, 血圧: #{row['Blood Pressure']}, メモ: #{row['Note']}, 歩数: #{row['Steps']}, 睡眠時間: #{row['Sleep Hours']}時間"
  end
end

# メインプログラムループ
loop do
  puts "1: 健康データを入力する"
  puts "2: 健康データを表示する"
  puts "3: レポートを生成する"
  puts "4: グラフを生成する"
  puts "5: 終了する"
  choice = gets.chomp.to_i

  case choice
  when 1
    data = get_health_data
    seve_health_data(data[:date], data[:weight], data[:blood_pressure], data[:note], data[:steps], data[:sleep_hours])
    puts "薬のんだ? 忘れずにね!"
  when 2
    display_csv_data
  when 3
    health_data = read_health_data
    create_pdf_report(health_data)
    puts "PDFレポートが作成されました: health_report.pdf"
  when 4
    health_data = read_health_data
    puts "グラフ絵お生成するフィールドを選んでください (weight, blood_pressure, steps, sleep_hours):"
    field = gets.chomp
    create_graph(health_data, fiald, "#{field.capitalize} Graph")
    puts "#{field.capitalize} グラフが生成されました: #{field}_graph.png"
  when 5
    # プログラム終了時に音声で挨拶
    system('espeak "今日も楽しく過ごそう!" -p 70 -s 150')
    break
  else
    puts "無効な選択です。もう一度試してください。"
  end
end
