# -*- coding: utf-8 -*-
# news.views.py

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseBadRequest
from django.template import RequestContext  # , Template, Context
from django.contrib.auth.decorators import user_passes_test  # login_required
from django.conf import settings

from news.models import NewsItem  # Story, Event, Announcement # , Pic
import os
import os.path
from people.funcs import is_fac_or_admin
import html
import urllib
import subprocess
from djphys.redirect import Redirect


def all_news(request):
    r = Redirect(request, "news/")
    if r:
        return r()
    qs = NewsItem.objects.filter(category='s').order_by('-date')
    return render(request, 'news/index.html', {'latest_news_list': qs})


def detail(request, pk):
    try:
        theStory = NewsItem.objects.get(id=pk)
    except:
        return HttpResponseRedirect('/news/')
    stories = []
    for s in NewsItem.objects.filter(category='s'):
        if len(stories) == 0 or stories[len(stories) - 1][0] != s.date.year:
            stories.append([s.date.year, []])
        stories[len(stories) - 1][1].append(s)
    return render(request, 'news/detail.html', {'theStory': theStory,
                                                'theYear': theStory.date.year,
                                                'menu_base_url': '/news/',
                                                'stories': stories,
                                                'maxwords': 6,
                                                })


def profile(request, pk):
    try:
        theStory = NewsItem.objects.get(id=pk)
    except:
        theStory = NewsItem.objects.filter(category='P')
        if theStory.count() == 0:
            return HttpResponseRedirect('/news/')
        else:
            theStory = theStory[0]
    return render(request, 'news/profile.html', {
        'theStory': theStory,
        'theYear': theStory.date.year,
        'menu_base_url': '/news/',
        'stories': NewsItem.objects.filter(category='P'),
        'maxwords': 6,
    })


def statement(request, pk):
    try:
        theStory = NewsItem.objects.get(id=pk)
    except:
        theStory = NewsItem.objects.filter(category='P')
        if theStory.count() == 0:
            return HttpResponseRedirect('/news/')
        else:
            theStory = theStory[0]
    return render(request, 'news/statement.html', {
        'theStory': theStory,
        'theYear': theStory.date.year,
        'menu_base_url': '/news/',
        'stories': NewsItem.objects.filter(category='P'),
        'maxwords': 6,
    })


def announcement(request, pk):
    the_announcement = get_object_or_404(NewsItem, pk=pk)
    return render(request, 'news/announcement.html', {'announcement': the_announcement})


from PIL import Image


class Pic(object):
    def __init__(self, dir, name):
        self.dir = dir
        self.name = name
        with Image.open(self.path()) as im:
            self.width, self.height = im.size
        self.aspect = self.width / self.height

    def __str__(self):
        return self.name

    def root(self):
        return os.path.join(settings.MEDIA_ROOT, 'photos')

    def path(self):
        return os.path.join(self.root(), self.dir, self.name)

    def baseurl(self):
        return os.path.join(settings.MEDIA_URL, 'photos')

    def url(self):
        t = os.path.join(self.baseurl(), self.dir, self.name)
        return urllib.parse.quote(t)

    def thumb(self):
        t = os.path.join(self.baseurl(), self.dir, 'thumb', self.name)
        self.make_thumb()
        return urllib.parse.quote(t)

    def make_thumb(self):
        t = os.path.join(self.root(), self.dir, 'thumb', self.name)
        if not os.path.exists(t):
            subprocess.call(['convert', '-resize', '12.5%',
                             "{0}".format(self.path()), '{0}'.format(t)])


@user_passes_test(is_fac_or_admin)
def directory(request, pk):
    """
    Given a valid logged in user and a suitable path to a folder, 
    of images, produce a page of thumbnails with links to the
    photographs. We will look to the settings module for the
    location of these files.
    """
    base = os.path.join(settings.MEDIA_ROOT, 'photos')
    target = html.unescape(pk)
    destination = os.path.join(base, pk)
    thumbs = os.path.join(destination, 'thumb')
    if not os.path.exists(thumbs):
        os.mkdir(thumbs)
    pics = []
    dirs = []
    # The following version requires Python 3.5
    if False:
        for f in os.scandir(destination):
            if f.is_file():
                # Is this a graphic file?
                b, ext = os.path.splitext(f.name)
                if ext.lower() in ('.jpg', '.jpeg', '.png'):
                    pics.append(Pic(dir=target, name=f.name))
            elif f.is_dir() and f.name != 'thumb':
                dirs.append(f.name)
    else:
        for f in os.listdir(destination):
            p = os.path.join(destination, f)
            if os.path.isfile(p):
                b, ext = os.path.splitext(f)
                if ext.lower() in ('.jpg', '.jpeg', '.png'):
                    pics.append(Pic(dir=target, name=f))
            elif os.path.isdir(p) and f != 'thumb':
                dirs.append(f)

    pics.sort(key=lambda x: '{0:.2f}{1}'.format(1.0 / x.aspect, x.name))
    dirs.sort()
    path = [('home', '/photos')]
    for d in pk.split('/'):
        if d:
            path.append(
                (d, os.path.join(path[-1][1], urllib.parse.quote(d))))
    if len(path) > 1:
        path.pop()  # remove the current directory
    params = {'pix': pics, 'dirs': dirs, 'path': path, 'target': target}
    return render(request, 'news/picdic.html', params)


@user_passes_test(is_fac_or_admin)
def basedirectory(request):
    return directory(request, '')


def affirmation_of_values(request):
    """
    5/12/21 Added a page with the affirmation of our values. For the
    moment, it goes to the announcement with all the context. Eventually,
    I should update to just the short and sweet.
    """
    try:
        statements = NewsItem.objects.filter(
            category='S', keywords__contains='community'
        ).order_by('-post_date')
        print(statements)
    except Exception as eeps:
        print(eeps)

    if statements.count() == 0:
        raise Exception("I couldn't find the affirmation")

    recent = statements[0]
    return statement(request, recent.id)


def dump(request):
    NewsItem.export()
    return detail(request, 1)
