from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.http import urlencode


class Progress:
    def __init__(self, task, total, stage=None):
        self.task = task
        self._total = total
        self._done = 0
        self._stage = stage

    def _update_state(self):
        self.task.update_state(
            state="PROGRESS",
            meta={
                "done": self._done,
                "total": self._total,
                "stage": self._stage,
            },
        )

    @property
    def done(self):
        return self._done

    @done.setter
    def done(self, value):
        self._done = value
        self._update_state()

    @property
    def total(self):
        return self._total

    @total.setter
    def total(self, value):
        self._total = value
        self._done = min(self._done, value)
        self._update_state()

    def did(self, delta):
        self._done += delta
        self._update_state()

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is None:
            self.done = self._total


def task_status_url(result, message=None, redirect=None):
    args = {}
    if message:
        args["message"] = message
    if redirect:
        args["redirect"] = redirect
    url = reverse("task_status", args=[result.id])
    if args:
        url += "?" + urlencode(args)
    return url


def redirect_to_task_status(result, message=None, redirect=None):
    return HttpResponseRedirect(task_status_url(result, message, redirect))