# add method
# 1) jpn_wday
# 2) holiday?
# 3) friday?
# 4) weekly_business_days
# 5) monthly_business_days
# 6) monthly_business_days_div_by_week

$KCODE = 's'
require 'calendar/japanese/holiday'
$KCODE = 'u'

class Date
  include Calendar::Japanese::Holiday
  include App::Const::Holiday
  #祝日をオーバーライド
  def holiday?
    return (weekend? or national_holiday? or substitute_holiday? or extra_holiday?(self))
  end

  #== 日本語曜日取得
  #_date_:: 判定対象日付
  #
  # 戻り値:: コピー
  #-----------------------------------------------------------------#++
  def jpn_wday
    wdays = ['日', '月', '火', '水', '木', '金', '土']
    return wdays[self.wday]
  end

  #== 日曜判定処理
  #
  # 戻り値:: true/false
  #-----------------------------------------------------------------#++
  def sunday?
    result = false
    
    if self.wday == 0
      result = true
    end
    
    return result
  end

  #== 金曜判定処理
  #
  # 戻り値:: true/false
  #-----------------------------------------------------------------#++
  def friday?
    result = false
    
    if self.wday == 5
      result = true
    end
    
    return result
  end

  #== 1週間の営業日数を取得する
  #
  # 戻り値:: 1週間の営業日
  #-----------------------------------------------------------------#++
  def weekly_business_days
    results = []
    
    now_date = self.beginning_of_week
    5.times do
      unless now_date.holiday?
        results.push(now_date.deep_copy)
      end
      now_date += 1
    end
    
    return results
  end

  #== 1ヶ月間の営業日を取得する
  #
  # 戻り値:: 1ヶ月間の営業日
  #-----------------------------------------------------------------#++
  def monthly_business_days
    results = []
    
    now_date = self.beginning_of_month
    end_date = self.end_of_month
    100.times do
      unless now_date.holiday?
        results.push(now_date.deep_copy)
      end
      
      if now_date === end_date
        break
      end
      
      now_date += 1
    end
    
    return results
  end
  
  #== 指定期間の営業日を取得する
  #
  # 戻り値:: 指定期間の営業日
  #-----------------------------------------------------------------#++
  def range_business_days(end_date, no_holiday_flag)
    results = []
    if self < end_date
      tmp_start = self
      tmp_end = end_date
    else
      tmp_start = end_date
      tmp_end = self
    end
    until tmp_start > tmp_end do
      if no_holiday_flag 
          results.push(tmp_start.deep_copy)
      else
        unless tmp_start.holiday? || tmp_start.strftime("%m%d")=="1230" || tmp_start.strftime("%m%d")=="1231" || tmp_start.strftime("%m%d")=="0102" || tmp_start.strftime("%m%d")=="0103"
          results.push(tmp_start.deep_copy)
        end
      end
      tmp_start += 1
    end
    return results
  end

  #== 1ヶ月間の日付を取得する
  #
  # 戻り値:: 1ヶ月間の日付(1週間毎の配列)
  #-----------------------------------------------------------------#++
  def monthly_days_div_by_week
    results = []
    
    now_date = self.beginning_of_month
    end_date = self.end_of_month
    w = []
    100.times do
      w.push(now_date.deep_copy)
      
      if (now_date.sunday?) || (now_date === end_date)
        if w.length > 0
          results.push(w)
          w = []
        end
      end
      if now_date === end_date
        break
      end
      now_date += 1
    end
    
    return results
  end
end