#!/usr/bin/python3

from getpass import getpass
import os
import re
from pprint import pprint

import requests


class HaricaAPI:
    def __init__(self):
        # For this demonstration, take email and password from environment variables
        self.url_base = os.environ.get("HARICA_URL_BASE", "https://cm-stg.harica.gr")
        self.email = os.environ["HARICA_EMAIL"]
        self.password = os.environ["HARICA_PASSWORD"]

        # We use a session to get cookies stored automatically, and to be able to set
        # headers for subsequent calls
        self.session = requests.Session()

        # These do not seem to be needed?
        # self.session.headers.update({"Content-Type": "application/json;charset=utf-8"})
        # self.session.headers.update({"Accept": "application/json, text/plain, */*"})

    def _update_rvt(self):
        """Update the RequestVerificationToken.

        Needs to be done before login. Also needs to be done again after login as the
        value changes."""

        r = self.session.get(self.url_base)
        m = re.search(
            r'<input name="__RequestVerificationToken".*value="([^"]+)"', r.text
        )
        rvt = m.group(1)
        self.session.headers.update({"RequestVerificationToken": rvt})

    def post(self, path, data=None):
        """Abstract the POST handling a bit so we do not have to repeat it everuwhere."""

        if data is None:
            data = {}
        r = self.session.post(self.url_base + path, json=data)
        r.raise_for_status()
        return r

    def login(self):
        """Login for user without 2FA."""

        self._update_rvt()
        login_data = {"email": self.email, "password": self.password}
        r = self.post("/api/User/Login", login_data)
        self.session.headers.update({"Authorization": r.text})
        self._update_rvt()

    def login_2fa(self, token):
        """Login for user with 2FA."""

        self._update_rvt()
        login_data = {"email": self.email, "password": self.password, "token": token}
        r = self.post("/api/User/Login2FA", login_data)
        self.session.headers.update({"Authorization": r.text})
        self._update_rvt()


h = HaricaAPI()

# Login for user without 2FA
h.login()

# Login for user with 2FA
# token = getpass("Token: ")
# h.login_2fa(token)

# Demonstrate some simple API calls

r = h.post("/api/User/GetCurrentUser")
pprint(r.json())

r = h.post("/api/ServerCertificate/CheckMachingOrganization", [{"domain": "liu.se"}])
pprint(r.json())
