"""oidc models"""
from typing import Optional

from django.db import models
from django.http import HttpRequest
from django.shortcuts import reverse
from django.utils.translation import gettext as _
from oidc_provider.models import Client

from passbook.core.models import Provider
from passbook.lib.utils.template import render_to_string


class OpenIDProvider(Provider):
    """OpenID Connect Provider for applications that support OIDC."""

    # Since oidc_provider doesn't currently support swappable models
    # (https://github.com/juanifioren/django-oidc-provider/pull/305)
    # we have a 1:1 relationship, and update oidc_client when the form is saved.

    oidc_client = models.OneToOneField(Client, on_delete=models.CASCADE)

    form = "passbook.providers.oidc.forms.OIDCProviderForm"

    @property
    def name(self):
        """Name property for UI"""
        return self.oidc_client.name

    def __str__(self):
        return f"OpenID Connect Provider {self.oidc_client.__str__()}"

    def html_setup_urls(self, request: HttpRequest) -> Optional[str]:
        """return template and context modal with URLs for authorize, token, openid-config, etc"""
        return render_to_string(
            "oidc_provider/setup_url_modal.html",
            {
                "provider": self,
                "authorize": request.build_absolute_uri(
                    reverse("passbook_providers_oidc:authorize")
                ),
                "token": request.build_absolute_uri(reverse("oidc_provider:token")),
                "userinfo": request.build_absolute_uri(
                    reverse("oidc_provider:userinfo")
                ),
                "provider_info": request.build_absolute_uri(
                    reverse("passbook_providers_oidc:provider-info")
                ),
            },
        )

    class Meta:

        verbose_name = _("OpenID Provider")
        verbose_name_plural = _("OpenID Providers")
