from datetime import datetime, date
from typing import Any
from utils import create_connection


def presence_user_bd(user_id: int) -> tuple:
    """Проверяем, существует ли пользователь в таблице users """
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users WHERE telegram_id = %s", (user_id,))
    return cursor.fetchone()

def adding_user_db(user_id: int, username: str) -> None:
    """Добавление пользователя в таблицу users (имя и id)"""
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute(
        "INSERT INTO users (telegram_id, telegram_username) VALUES (%s, %s)",
        (user_id, username))
    conn.commit()


def update_user_db(cursor: Any, thread_id: int, telegram_id: int) -> None:
    """Обновление данных по пользователю в таблице users. Добавление айди чата приватного с ботом """
    cursor.execute("UPDATE users SET telegram_thread_id = %s WHERE telegram_id = %s", (thread_id, telegram_id))


def user_search(cursor: Any, message_thread_id: int) -> tuple:
    """Поиск пользователя по id в таблице users """
    cursor.execute("SELECT * FROM users WHERE telegram_thread_id = %s", (message_thread_id,))
    return cursor.fetchone()


def adding_well(cursor: Any, well: int) -> None:
    """ Запись курса доллара в таблицу USD_RUB """
    cursor.execute("REPLACE INTO USD_RUB (id, well) VALUES (%s, %s)", (1, well))


def getting_course(cursor: Any) -> tuple:
    """ Получение курса из таблицы USD_RUB """
    cursor.execute("SELECT * FROM USD_RUB WHERE id = 1;")
    return cursor.fetchone()


def installation_one_question(cursor: Any, telegram_id: int) -> None:
    """ Установка единицы в столбце question_time, чтобы блокировать дальнейшие отправки """
    new = 1
    cursor.execute("UPDATE users SET question_time = %s WHERE telegram_id = %s", (new, telegram_id))


def installation_zero_question(cursor: Any, telegram_id: int) -> None:
    """ Установка нуля в столбце question_time, чтобы разблокировать дальнейшие отправки вопросов """
    new = 0
    cursor.execute("UPDATE users SET question_time = %s WHERE telegram_id = %s", (new, telegram_id))


def status_question(cursor: Any, telegram_id: int) -> tuple:
    """ Получение статуса вопроса (1 или 0) """
    cursor.execute("SELECT question_time FROM users WHERE telegram_id = %s", (telegram_id,))
    return cursor.fetchone()


def write_hash_to_table(cursor: Any, hash_user: str, telegram_id: int) -> None:
    """ Запись успешного хэша в successful_hash """
    cursor.execute("INSERT INTO successful_hash (hash_users, telegram_id) VALUES (%s, %s)", (hash_user, telegram_id))


def search_hash_in_table(cursor: Any, hash_user: str,) -> bool:
    """ Поиск хэша в таблице successful_hash """
    cursor.execute("SELECT EXISTS(SELECT 1 FROM successful_hash WHERE hash_users = %s)", (hash_user,))
    result = cursor.fetchone()
    return result[0] if result else False


def number_of_streams_from_subscriptions(cursor: Any, telegram_id: int) -> None:
    """ Запись 3 ед в столбец count_streams, при условии что нет активной подписки """
    new = 3
    cursor.execute(
        "UPDATE users SET count_streams = count_streams + %s "
        "WHERE telegram_id = %s AND (sub_datetime_end IS NULL OR sub_datetime_end = '0')",
        (new, telegram_id)
    )


def number_of_threads_from_threads(cursor: Any, telegram_id: int, price_usd: int) -> None:
    """ Плюсование на количество потоков в столбец count_streams к уже существующему значению """
    cursor.execute("UPDATE users SET count_streams = count_streams + %s WHERE telegram_id = %s",
                   (price_usd, telegram_id))


def get_user_data(cursor: Any, telegram_id: int) -> tuple:
    """ Получаем кортеж с данными по пользователю из бд из таблицы users """
    cursor.execute("SELECT * FROM users WHERE telegram_id = %s", (telegram_id,))
    return cursor.fetchone()


def subscription_entry(cursor: Any, telegram_id: int, price_usd: int) -> None:
    """ Запись количества месяцев в subscription_option """
    cursor.execute("UPDATE users SET subscription_option = subscription_option + %s WHERE telegram_id = %s",
                   (price_usd, telegram_id))


def subscription_end_record(cursor, telegram_id: int) -> None:
    """ Запись даты окончания подписки в столбцы sub_datetime_end и subscription_endtime_bot """
    current_date = datetime.now()  # Получение текущей даты
    # Получение количества месяцев из столбца subscription_option
    select_query = """SELECT subscription_option FROM users WHERE telegram_id = %s"""
    cursor.execute(select_query, (telegram_id,))
    result = cursor.fetchone()
    # Преобразование значения в число
    if result:
        subscription_option = result[0]
        if isinstance(subscription_option, str):  # Проверка типа данных
            subscription_option = int(subscription_option.split()[0])
    else:
        return
    # Формирование запроса на обновление
    update_query = """
        UPDATE users
        SET sub_datetime_end = DATE_ADD(NOW(), INTERVAL %s MONTH),
            subscription_endtime_bot = DATE_ADD(NOW(), INTERVAL %s MONTH)
        WHERE telegram_id = %s
    """
    cursor.execute(update_query, (subscription_option, subscription_option, telegram_id))


def check_expired_subscriptions() -> list:
    """ Получение списка id пользователей, у которых просрочена подписка """
    conn = create_connection()
    cursor = conn.cursor()
    current_date = date.today()
    query = """SELECT telegram_id FROM users WHERE subscription_endtime_bot < %s"""
    cursor.execute(query, (current_date,))
    results = cursor.fetchall()
    expired_users = [result[0] for result in results]
    return expired_users


def reset_user_data(telegram_id: int) -> None:
    """Обнуляет данные по подписке у пользователя в таблице."""
    conn = create_connection()
    cursor = conn.cursor()
    update_query = """
        UPDATE users
        SET sub_datetime_end = 0,
            subscription_option = 0,
            subscription_endtime_bot = NULL,
            count_streams = 0
        WHERE telegram_id = %s
    """
    cursor.execute(update_query, (telegram_id,))
    conn.commit()
