# coding: utf-8

require 'rest-client'
require 'json'
require 'date'
require 'holiday_jp'
require 'gmail'
require 'rexml/document'

class MyMail
  #GMail関連の設定
  ID = "GMail address"
  PW = "GMail password"
  TO = "mail send to address"

  def self.send(sbj,msg)
    gmail = Gmail.new(ID, PW)

    message =
      gmail.generate_message do
        to TO
        subject sbj
        body msg
      end

    gmail.deliver(message)
    gmail.logout
  end
end

class LineBot
  #LINE関連の設定
  TOKEN = "Channel Access Token"
  TO    = "送信先のID"

  def self.send(msg)
    headers = {
      "Content-Type"  => "application/json; charser=UTF-8",
      "Authorization" => "Bearer #{TOKEN}",
    }

    params = {
      to: TO,
      messages: [
        {
          type: "text",
          text: msg,
        }
      ]
    }

    RestClient.post "https://api.line.me/v2/bot/message/push", params.to_json, headers
  end
end

class RainChk
  #降水確率を取得したい地域情報
  #以下を確認して設定する
  #http://www.drk7.jp/weather/
  #以下は東京の例
  PREF = "http://www.drk7.jp/weather/xml/13.xml"
  AREA = "東京地方"

  def self.get_info(day,limit)
    begin
      response = RestClient.get PREF
    rescue => e
      p e.response
    end

    doc = REXML::Document.new response.to_str

    day = day.strftime("%Y/%m/%d")

    ret = {}
    ret[:rain] = false
    ret[:info] = []
    doc.elements.each("weatherforecast/pref/area[@id='#{AREA}']/info[@date='#{day}']/rainfallchance/period") do |element|
      next if element.attributes["hour"] == "00-06"
      ret[:info].push [element.attributes["hour"],element.text + "%"]
      ret[:rain] = true if element.text.to_i >= limit
    end
    ret
  end
end

if HolidayJp.holiday?(Date.today)
  print "#{Time.now.to_s} holiday!\n"
  exit
end

#確認したい日付と降水確率が何%以上で雨を降るとみなすかの閾値を渡す
ret = RainChk.get_info Date.today,50

if ret[:rain]
  msg = "雨が降るかもしれません。"
  ret[:info].each do |a|
    msg = msg + "\n #{a[0]} #{a[1]}"
  end

  begin
    LineBot.send(msg)
  rescue => e
    print "#{Time.now.to_s} line bot error raise!\n"
    MyMail.send "line bot error raise",e.response
    exit
  end
  print "#{Time.now.to_s} rainy day!\n"
else
  print "#{Time.now.to_s} sunny day.\n"
end