# -*- coding: utf-8 -*-
from . import Lunar, LunarMonth
from .util import LunarUtil, FotoUtil


class Foto:
    """
    佛历
    """

    DEAD_YEAR = -543

    def __init__(self, lunar):
        self.__lunar = lunar

    @staticmethod
    def fromLunar(lunar):
        return Foto(lunar)

    @staticmethod
    def fromYmdHms(year, month, day, hour, minute, second):
        return Foto.fromLunar(Lunar.fromYmdHms(year + Foto.DEAD_YEAR - 1, month, day, hour, minute, second))

    @staticmethod
    def fromYmd(year, month, day):
        return Foto.fromYmdHms(year, month, day, 0, 0, 0)

    def getLunar(self):
        return self.__lunar

    def getYear(self):
        sy = self.__lunar.getSolar().getYear()
        y = sy - Foto.DEAD_YEAR
        if sy == self.__lunar.getYear():
            y += 1
        return y

    def getMonth(self):
        return self.__lunar.getMonth()

    def getDay(self):
        return self.__lunar.getDay()

    def getYearInChinese(self):
        y = str(self.getYear())
        s = ""
        for i in range(0, len(y)):
            s += LunarUtil.NUMBER[ord(y[i]) - 48]
        return s

    def getMonthInChinese(self):
        return self.__lunar.getMonthInChinese()

    def getDayInChinese(self):
        return self.__lunar.getDayInChinese()

    def getFestivals(self):
        festivals = []
        md = "%d-%d" % (abs(self.getMonth()), self.getDay())
        if md in FotoUtil.FESTIVAL:
            fs = FotoUtil.FESTIVAL[md]
            for f in fs:
                festivals.append(f)
        return festivals

    def getOtherFestivals(self):
        """
        获取纪念日
        :return: 非正式的节日列表，如中元节
        """
        festivals = []
        key = "%d-%d" % (self.getMonth(), self.getDay())
        if key in FotoUtil.OTHER_FESTIVAL:
            for f in FotoUtil.OTHER_FESTIVAL[key]:
                festivals.append(f)
        return festivals

    def isMonthZhai(self):
        m = self.getMonth()
        return 1 == m or 5 == m or 9 == m

    def isDayYangGong(self):
        for f in self.getFestivals():
            if "杨公忌" == f.getName():
                return True
        return False

    def isDayZhaiShuoWang(self):
        d = self.getDay()
        return 1 == d or 15 == d

    def isDayZhaiSix(self):
        d = self.getDay()
        if 8 == d or 14 == d or 15 == d or 23 == d or 29 == d or 30 == d:
            return True
        elif 28 == d:
            m = LunarMonth.fromYm(self.__lunar.getYear(), self.getMonth())
            return m is not None and 30 != m.getDayCount()
        return False

    def isDayZhaiTen(self):
        d = self.getDay()
        return 1 == d or 8 == d or 14 == d or 15 == d or 18 == d or 23 == d or 24 == d or 28 == d or 29 == d or 30 == d

    def isDayZhaiGuanYin(self):
        k = "%d-%d" % (self.getMonth(), self.getDay())
        for d in FotoUtil.DAY_ZHAI_GUAN_YIN:
            if k == d:
                return True
        return False

    def getXiu(self):
        return FotoUtil.getXiu(self.getMonth(), self.getDay())

    def getXiuLuck(self):
        return LunarUtil.XIU_LUCK[self.getXiu()]

    def getXiuSong(self):
        return LunarUtil.XIU_SONG[self.getXiu()]

    def getZheng(self):
        return LunarUtil.ZHENG[self.getXiu()]

    def getAnimal(self):
        return LunarUtil.ANIMAL[self.getXiu()]

    def getGong(self):
        return LunarUtil.GONG[self.getXiu()]

    def getShou(self):
        return LunarUtil.SHOU[self.getGong()]

    def __str__(self):
        return self.toString()

    def toString(self):
        return "%s年%s月%s" % (self.getYearInChinese(), self.getMonthInChinese(), self.getDayInChinese())

    def toFullString(self):
        s = self.toString()
        for f in self.getFestivals():
            s += " (%s)" % f
        return s
