#  holidays
#  --------
#  A fast, efficient Python library for generating country, province and state
#  specific sets of holidays on the fly. It aims to make determining whether a
#  specific date is a holiday as fast and flexible as possible.
#
#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
#  Website: https://github.com/vacanza/holidays
#  License: MIT (see LICENSE file)

from gettext import gettext as tr

from holidays.groups import ChristianHolidays, InternationalHolidays
from holidays.observed_holiday_base import (
    ObservedHolidayBase,
    SAT_SUN_TO_NEXT_MON,
    SAT_SUN_TO_NEXT_MON_TUE,
)


class Tuvalu(ObservedHolidayBase, ChristianHolidays, InternationalHolidays):
    """Tuvalu holidays.

    References:
        * [Public holidays in Tuvalu](https://en.wikipedia.org/wiki/Public_holidays_in_Tuvalu)
        * [Today's and Upcoming Holidays in Tuvalu](https://www.timeanddate.com/holidays/tuvalu/)
        * [Public Holidays (Amendment) Act 1990](https://www.paclii.org/cgi-bin/sinodisp/tv/legis/num_act/pha1990243/pha1990243.html)
        * [Public Holidays Act 1](https://tuvalu-legislation.tv/cms/images/LEGISLATION/PRINCIPAL/1937/1937-0005/1937-0005_1.pdf)
        * [Public Holidays (Amendment) Act 2018](https://tuvalu-legislation.tv/cms/images/LEGISLATION/AMENDING/Public%20Holidays%20(Amendment)%20Act/Public%20Holidays%20(Amendment)%20Act%202018/Public%20Holidays%20(Amendment)%20Act%202018.pdf)
        * [Public Holidays (Amendment) Act 2020](https://tuvalu-legislation.tv/cms/images/LEGISLATION/AMENDING/2020/2020-0013/2020-0013.pdf)
        * [Public Holidays Act 2](https://tuvalu-legislation.tv/cms/images/LEGISLATION/PRINCIPAL/1937/1937-0005/1937-0005_2.pdf)
        * [Codes for the representation of names of countries and their subdivisions](https://www.iso.org/obp/ui/#iso:code:3166:TV)
        * [TUVALU-NEWS.TV](https://web.archive.org/web/20140915180104/http://www.tuvalu-news.tv/archives/2007/01/island_special_public_holidays.html)
    """

    country = "TV"
    default_language = "tvl"
    # %s (observed).
    observed_label = tr("%s (fakamatakuga)")
    # Tuvalu became fully independent of the United Kingdom on October 1, 1978
    # Tuvalu's PUBLIC HOLIDAYS (AMENDMENT) ACT 1990 (Act 2 of 1990)
    # It was first proclaimed on FEB 7th, 1990
    start_year = 1990
    subdivisions = (
        "FUN",  # Funafuti.
        "NIT",  # Niutao.
        "NKF",  # Nukufetau.
        "NKL",  # Nukulaelae.
        "NMA",  # Nanumea.
        "NMG",  # Nanumaga.
        "NUI",  # Nui.
        "VAI",  # Vaitupu.
    )
    subdivisions_aliases = {
        # Town/Island Councils.
        "Funafuti": "FUN",
        "Niutao": "NIT",
        "Nukufetau": "NKF",
        "Nukulaelae": "NKL",
        "Nanumea": "NMA",
        "Nanumaga": "NMG",
        "Nanumanga": "NMG",  # Ex-ISO code alias
        "Nui": "NUI",
        "Vaitupu": "VAI",
    }
    supported_languages = ("en_GB", "en_US", "tvl")

    def __init__(self, *args, **kwargs):
        ChristianHolidays.__init__(self)
        InternationalHolidays.__init__(self)
        kwargs.setdefault("observed_rule", SAT_SUN_TO_NEXT_MON)
        super().__init__(*args, **kwargs)

    def _populate_public_holidays(self):
        # New Year's Day.
        self._add_observed(self._add_new_years_day(tr("Tausaga Fou")))

        if self._year <= 2020:
            # Commonwealth Day.
            self._add_holiday_2nd_mon_of_mar(tr("Aso Atefenua"))

        # Good Friday.
        self._add_good_friday(tr("Aso toe tu"))

        # Easter Monday.
        self._add_easter_monday(tr("Toe Tu aso gafua"))

        # Gospel Day.
        self._add_holiday_1_day_past_2nd_sun_of_may(tr("Te Aso o te Tala Lei"))

        self._add_holiday_2nd_sat_of_jun(
            # King's Birthday.
            tr("Asofanau Tupu")
            if self._year >= 2023
            # Queen's Birthday.
            else tr("Asofanau Fafine")
        )

        # National Children's Day.
        name = tr("Aso Tamaliki")
        if self._year >= 2019:
            # National Youth Day.
            self._add_holiday_1st_mon_of_aug(tr("Aso tupulaga"))

            # National Children's Day.
            self._add_holiday_1_day_past_2nd_sun_of_oct(name)
        else:
            # National Children's Day.
            self._add_holiday_1st_mon_of_aug(name)

        # Tuvalu Day.
        name = tr("Tutokotasi")
        self._add_observed(self._add_holiday_oct_1(name), rule=SAT_SUN_TO_NEXT_MON_TUE)
        self._add_observed(self._add_holiday_oct_2(name), rule=SAT_SUN_TO_NEXT_MON_TUE)

        # https://en.wikipedia.org/wiki/King%27s_Official_Birthday#Tuvalu
        if self._year <= 2022:
            # Heir to the Throne's Birthday.
            self._add_holiday_2nd_mon_of_nov(tr("Aso fanau o te sui ote Tupu"))

        # Christmas Day.
        self._add_observed(self._add_christmas_day(tr("Kilisimasi")), rule=SAT_SUN_TO_NEXT_MON_TUE)
        self._add_observed(
            # Boxing Day.
            self._add_christmas_day_two(tr("Aso Faipele")),
            rule=SAT_SUN_TO_NEXT_MON_TUE,
        )

    def _populate_subdiv_fun_public_holidays(self):
        # The Day of the Bombing.
        self._add_holiday_apr_23(tr("Te Aso o te Paula"))

        # Cyclone Day.
        self._add_holiday_oct_21(tr("Aso o te matagi"))

    def _populate_subdiv_nit_public_holidays(self):
        # Niutao Day.
        self._add_holiday_sep_17(tr("Te Aso o te Setema"))

    def _populate_subdiv_nkf_public_holidays(self):
        # Nukufetau Day.
        self._add_holiday_feb_11(tr("Te Aso O Tutasi"))

    def _populate_subdiv_nkl_public_holidays(self):
        # Gospel Day.
        self._add_holiday_may_10(tr("Te Aso o te Tala Lei"))

    def _populate_subdiv_nma_public_holidays(self):
        # Golden Jubilee.
        self._add_holiday_jan_8(tr("Te Po o Tefolaha"))

        # Big Day.
        self._add_holiday_feb_3(tr("Po Lahi"))

    def _populate_subdiv_nmg_public_holidays(self):
        # Nanumaga Day.
        self._add_holiday_apr_15(tr("Aho o te Fakavae"))

    def _populate_subdiv_nui_public_holidays(self):
        # Day of the Flood.
        self._add_holiday_feb_16(tr("Bogin te Ieka"))

    def _populate_subdiv_vai_public_holidays(self):
        # Happy Day.
        self._add_holiday_nov_25(tr("Te Aso Fiafia"))


class TV(Tuvalu):
    pass


class TUV(Tuvalu):
    pass
