from django.shortcuts import render
from datetime import datetime, timedelta
from iching.utils import bz
import math
from django.shortcuts import redirect

def index(request):
    return redirect('calendar10k:year', year=datetime.now().year)

def validateAuthYear(request, year):
    valid = False
    yearnow = datetime.now().year
    if yearnow-1 <= year <= yearnow+1 or request.user.is_authenticated:
        valid = True
    return valid

def validateYear(request, year):
    return 1550 <= year <= 2648

from django.contrib.auth.decorators import login_required
@login_required
def loginView(request, year):
    return render(request)

from iching.utils import bz, bz24, lunar_calendar
def year_view(request, year):
    if not validateAuthYear(request, year):
        return loginView(request, year)
    elif not validateYear(request, year):
        return render(request, 'calendar10k/year.html', {'error': "The request year is out of range.", 'curyear': datetime.now().year})
    
    cycles = bz24.calc24CycleAdjustedYear(year, groupByMonth=True) #return in utc+0
    idx, mmax = 0, 0
    for i in range(len(cycles)):
        mdx = 0
        for key, val in cycles[i].items():
            date = datetime.strptime(val['d'], '%Y-%m-%d %H:%M:%S') + timedelta(hours=8)
            bzdate = bz.getCalendar10kGodEarthStem(date.year, date.month, date.day, date.hour, date.minute, date.second)
            cycles[i][key]['bz'] = bzdate
            cycles[i][key]['bz']['month']['element'] = bz.getEarthElement(bzdate['month']['e'])
            cycles[i][key]['time'] = date.strftime('%H:%M:%S')

            next = datetime.strptime(val['next'], '%Y-%m-%d %H:%M:%S') + timedelta(hours=8)
            dates = []
            cur = datetime(date.year, date.month, date.day)
            end = datetime(next.year, next.month, next.day)
            first = True
            while(cur < end):
                d = {}
                d['lunar'] = lunar_calendar.convertLunar(cur)
                d['d'] = cur.day
                d['m'] = cur.month
                d['w'] = cur.weekday
                d['idx'] = idx
                d['first'] = True if first else False

                #calculate jian chu 12 god
                if first:
                    de = bzdate['day']['e']
                    me = bzdate['month']['e']
                else:
                    de = (de + 1) % 12
                    me = (me + 1) % 12
                daybz = {'day': {'e': de}, 'month': {'e': me}}
                d['jc12'] = bz.calcJianChu12God(cur.year, cur.month, cur.day, daybz)

                first = False

                dates.append(d)

                idx += 1
                mdx += 1
                cur = cur + timedelta(days=1)
            cycles[i][key]['dates'] = dates
        mmax = max(mdx, mmax)
        cycles[i]['count'] = mdx
        cycles[i]['first']['star'] = bz.getStarName(bz.calcMonthFlyingStar(date.year, date.month))
    cycles[0]['max'] = mmax
    cycles[0]['first']['bz']['year']['element'] = bz.getEarthElement(cycles[0]['first']['bz']['year']['e'])
    cycles[0]['first']['bz']['year']['animal'] = bz.getEarthAnimal(cycles[0]['first']['bz']['year']['e'])
    cycles[0]['first']['bz']['year']['star'] = bz.getStarName(bz.calcYearFlyingStar(year))

    # for use in template to render the remaining row, for month with days that is less than the highest number of days of a month
    for i in range(len(cycles)):
        if cycles[0]['max'] > cycles[i]['count']:
            remain = cycles[0]['max'] - cycles[i]['count']
            cycles[i]['remain'] = tuple(None for _ in range(remain))

    #pagination for next & prev year
    prevyear = year-1 if year > 1550 else False
    nextyear = year+1 if year < 2648 else False
    paginate = {'next': nextyear, 'prev': prevyear}

    context = {
        'year': year,
        'cycles': cycles,
        'paginate': paginate,
    }
    
    return render(request, 'calendar10k/year.html', context)