# encoding: utf-8
module Holidays
  # This file is generated by the Ruby Holidays gem.
  #
  # Definitions loaded: definitions/nz.yaml
  #
  # All the definitions are available at https://github.com/holidays/holidays
  module NZ # :nodoc:
    def self.defined_regions
      [:nz, :nz_sl, :nz_we, :nz_ak, :nz_nl, :nz_ne, :nz_ot, :nz_ta, :nz_sc, :nz_hb, :nz_mb, :nz_ca, :nz_ch, :nz_wl]
    end

    def self.holidays_by_month
      {
                0 => [{:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Good Friday", :regions => [:nz]},
            {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 1, :name => "Easter Monday", :regions => [:nz]},
            {:function => "matariki(year)", :function_arguments => [:year], :name => "Matariki", :regions => [:nz]}],
      1 => [{:mday => 1, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "New Year's Day", :regions => [:nz]},
            {:mday => 2, :observed => "to_weekday_if_boxing_weekend(date)", :observed_arguments => [:date], :name => "Day after New Year's Day", :regions => [:nz]},
            {:mday => 17, :name => "Southland Anniversary Day", :regions => [:nz_sl]},
            {:mday => 22, :observed => "closest_monday(date)", :observed_arguments => [:date], :name => "Wellington Anniversary Day", :regions => [:nz_we]},
            {:mday => 29, :observed => "closest_monday(date)", :observed_arguments => [:date], :name => "Auckland Anniversary Day", :regions => [:nz_ak]},
            {:mday => 29, :observed => "closest_monday(date)", :observed_arguments => [:date], :name => "Northland Anniversary Day", :regions => [:nz_nl]}],
      2 => [{:mday => 1, :observed => "closest_monday(date)", :observed_arguments => [:date], :name => "Nelson Anniversary Day", :regions => [:nz_ne]},
            {:mday => 6, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Waitangi Day", :regions => [:nz]}],
      3 => [{:mday => 23, :observed => "closest_monday(date)", :observed_arguments => [:date], :name => "Otago Anniversary Day", :regions => [:nz_ot]},
            {:wday => 1, :week => 2, :observed => "closest_monday(date)", :observed_arguments => [:date], :name => "Taranaki Anniversary Day", :regions => [:nz_ta]}],
      4 => [{:mday => 25, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "ANZAC Day", :regions => [:nz]}],
      6 => [{:wday => 1, :week => 1, :year_ranges => { :until => 2022 },:name => "Queen's Birthday", :regions => [:nz]},
            {:wday => 1, :week => 1, :year_ranges => { :from => 2023 },:name => "King's Birthday", :regions => [:nz]}],
      9 => [{:wday => 1, :week => 4, :name => "Dominion Day", :regions => [:nz_sc]}],
      10 => [{:wday => 1, :week => 1, :observed => "previous_friday(date)", :observed_arguments => [:date], :name => "Hawke's bay Anniversary Day", :regions => [:nz_hb]},
            {:wday => 1, :week => 4, :name => "Labour Day", :regions => [:nz]},
            {:wday => 1, :week => 4, :observed => "next_week(date)", :observed_arguments => [:date], :name => "Marlborough Anniversary Day", :regions => [:nz_mb]}],
      11 => [{:wday => 5, :week => 2, :name => "Canterbury Anniversary Day", :regions => [:nz_ca]},
            {:mday => 30, :observed => "closest_monday(date)", :observed_arguments => [:date], :name => "Chatham Island Anniversary Day", :regions => [:nz_ch]}],
      12 => [{:mday => 1, :observed => "closest_monday(date)", :observed_arguments => [:date], :name => "Westland Anniversary Day", :regions => [:nz_wl]},
            {:mday => 25, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:nz]},
            {:mday => 26, :observed => "to_weekday_if_boxing_weekend(date)", :observed_arguments => [:date], :name => "Boxing Day", :regions => [:nz]}]
      }
    end

    def self.custom_methods
      {
          "closest_monday(date)" => Proc.new { |date|
if [1, 2, 3, 4].include?(date.wday)
  date -= (date.wday - 1)
elsif 0 == date.wday
  date += 1
else
  date += 8 - date.wday
end
date
},

"previous_friday(date)" => Proc.new { |date|
date - 3
},

"next_week(date)" => Proc.new { |date|
date + 7
},

"matariki(year)" => Proc.new { |year|
@matariki_dates ||= {
'2022' => Date.civil(2022, 6, 24),
'2023' => Date.civil(2023, 7, 14),
'2024' => Date.civil(2024, 6, 28),
'2025' => Date.civil(2025, 6, 20),
'2026' => Date.civil(2026, 7, 10),
'2027' => Date.civil(2027, 6, 25),
'2028' => Date.civil(2028, 7, 14),
'2029' => Date.civil(2029, 7, 6),
'2030' => Date.civil(2030, 6, 21),
'2031' => Date.civil(2031, 7, 11),
'2032' => Date.civil(2032, 7, 2),
'2033' => Date.civil(2033, 6, 24),
'2034' => Date.civil(2034, 7, 7),
'2035' => Date.civil(2035, 6, 29),
'2036' => Date.civil(2036, 7, 18),
'2037' => Date.civil(2037, 7, 10),
'2038' => Date.civil(2038, 6, 25),
'2039' => Date.civil(2039, 7, 15),
'2040' => Date.civil(2040, 7, 6),
'2041' => Date.civil(2041, 7, 19),
'2042' => Date.civil(2042, 7, 11),
'2043' => Date.civil(2043, 7, 3),
'2044' => Date.civil(2044, 6, 24),
'2045' => Date.civil(2045, 7, 7),
'2046' => Date.civil(2046, 6, 29),
'2047' => Date.civil(2047, 7, 19),
'2048' => Date.civil(2048, 7, 3),
'2049' => Date.civil(2049, 6, 25),
'2050' => Date.civil(2050, 7, 15),
'2051' => Date.civil(2051, 6, 30),
'2052' => Date.civil(2052, 6, 21),
}
@matariki_dates[year.to_s]
},


      }
    end
  end
end
