from flask import current_app
from sqlite3 import Error, Connection
from typing import Tuple, Any
from tlapbot.owncast_helpers import use_points
from tlapbot.redeems import is_redeem_active


def add_to_milestone(db: Connection, user_id: str, redeem_name: str, points_donated: int) -> bool:
    try:
        cursor = db.execute(
            "SELECT progress, goal FROM milestones WHERE name = ?",
            (redeem_name,)
        )
        row = cursor.fetchone()
        if row is None:
            current_app.logger.warning("Milestone not found in database.")
            current_app.logger.warning("Maybe you forgot to run the refresh-milestones CLI command "
                                       "after you added a new milestone to the config?")
            return False
        progress, goal = row
        if progress + points_donated > goal:
            points_donated = goal - progress
            if points_donated < 0:
                points_donated = 0
        if use_points(db, user_id, points_donated):
            cursor = db.execute(
                "UPDATE milestones SET progress = ? WHERE name = ?",
                (progress + points_donated, redeem_name)
            )
            db.commit()
            return True
    except Error as e:
        current_app.logger.error(f"Error occurred updating milestone: {e.args[0]}")
    return False

def milestone_complete(db: Connection, redeem_name: str) -> bool | None:
    """Returns None only if error was logged."""
    try:
        cursor = db.execute(
            "SELECT progress, goal FROM milestones WHERE name = ?",
            (redeem_name,)
        )
        row = cursor.fetchone()
        if row is None:
            current_app.logger.warning("Milestone not found in database.")
            current_app.logger.warning("Maybe you forgot to run the refresh-milestones CLI command "
                                       "after you added a new milestone to the config?")
        else:
            progress, goal = row
            if progress == goal:
                return True
            return False
    except Error as e:
        current_app.logger.error(f"Error occurred checking if milestone is complete: {e.args[0]}")


def all_milestones(db: Connection) -> list[Tuple[str, int, int]] | None:
    """Returns list of all (even inactive) milestones, their progress and their goal.
    Returns None only if error was logged."""
    try:
        cursor = db.execute(
            """SELECT name, progress, goal FROM milestones"""
        )
        return cursor.fetchall()
    except Error as e:
        current_app.logger.error(f"Error occurred selecting all milestones: {e.args[0]}")


def all_active_milestones(db: Connection) -> list[Tuple[str, int, int]] | None:
    """Returns list of all active milestones, their progress and their goal.
    Returns None only if error was logged."""
    milestones = all_milestones(db)
    if milestones is not None:
        all_active_milestones = []
        for name, progress, goal in milestones:
            if is_redeem_active(name):
                all_active_milestones.append((name, progress, goal))
        return all_active_milestones