import datetime as dt

from django.conf import settings
from django.http import JsonResponse
from django.urls import reverse
from django.views import View
from pretalx.agenda.views.schedule import ScheduleMixin
from pretalx.common.views.mixins import EventPermissionRequired
from pretalx.schedule.exporters import ScheduleData

from ..utils.placeholders import placeholders


class BroadcastToolsScheduleView(EventPermissionRequired, ScheduleMixin, View):
    permission_required = "agenda.view_schedule"

    def get(self, request, *args, **kwargs):
        schedule = ScheduleData(
            event=self.request.event,
            schedule=self.schedule,
        )
        infoline = str(
            schedule.event.settings.broadcast_tools_lower_thirds_info_string or ""
        )
        try:
            return JsonResponse(
                {
                    "rooms": sorted(
                        {
                            room["name"].localize(schedule.event.locale)
                            for day in schedule.data
                            for room in day["rooms"]
                        }
                    ),
                    "talks": [
                        {
                            "id": talk.submission.id,
                            "start": talk.start.astimezone(
                                schedule.event.tz
                            ).isoformat(),
                            "start_ts": int(talk.start.timestamp()),
                            "end": (talk.start + dt.timedelta(minutes=talk.duration))
                            .astimezone(schedule.event.tz)
                            .isoformat(),
                            "end_ts": int(
                                (
                                    talk.start + dt.timedelta(minutes=talk.duration)
                                ).timestamp()
                            ),
                            "slug": talk.frab_slug,
                            "title": talk.submission.title,
                            "persons": [
                                person.get_display_name()
                                for person in talk.submission.speakers.all()
                            ],
                            "track": {
                                "color": talk.submission.track.color,
                                "name": str(talk.submission.track.name),
                            }
                            if talk.submission.track
                            else None,
                            "room": room["name"].localize(schedule.event.locale),
                            "infoline": infoline.format(**placeholders(schedule, talk)),
                            "image_url": talk.submission.image_url,
                            "locale": talk.submission.content_locale,
                            "do_not_record": talk.submission.do_not_record,
                            "abstract": talk.submission.abstract,
                            "urls": {
                                "feedback": "{}{}".format(
                                    schedule.event.custom_domain or settings.SITE_URL,
                                    talk.submission.urls.feedback,
                                ),
                                "feedback_qr": reverse(
                                    "plugins:pretalx_broadcast_tools:feedback_qr_id",
                                    kwargs={
                                        "event": schedule.event.slug,
                                        "talk": talk.submission.id,
                                    },
                                ),
                                "public": "{}{}".format(
                                    schedule.event.custom_domain or settings.SITE_URL,
                                    talk.submission.urls.public,
                                ),
                                "public_qr": reverse(
                                    "plugins:pretalx_broadcast_tools:public_qr_id",
                                    kwargs={
                                        "event": schedule.event.slug,
                                        "talk": talk.submission.id,
                                    },
                                ),
                            },
                        }
                        for day in schedule.data
                        for room in day["rooms"]
                        for talk in room["talks"]
                    ],
                },
            )
        except KeyError as e:
            key = str(e)[1:-1]
            return JsonResponse(
                {
                    "error": [
                        f"Could not find value for placeholder {{{key}}} in info line.",
                        f"If you want to use {{{key}}} without evaluating it, please use as follows: {{{{{key}}}}}",
                    ],
                }
            )
        except Exception as e:
            return JsonResponse(
                {
                    "error": [
                        repr(e),
                    ],
                }
            )
