import mysql.connector
from datetime import datetime
import re

def fix_date_format(date_str: str) -> str | None:
    """
    Проверяет строку даты и приводит её к формату ГГГГ.ММ.ДД.
    Возвращает исправленную строку или None, если формат не распознан.
    """
    # Правильный формат: ГГГГ.ММ.ДД
    if re.match(r'^\d{4}\.\d{2}\.\d{2}$', date_str):
        return date_str
    # Неправильный формат: ДД.ММ.ГГГГ
    if re.match(r'^\d{2}\.\d{2}\.\d{4}$', date_str):
        day, month, year = date_str.split('.')
        return f"{year}.{month}.{day}"
    # Неизвестный формат
    return None

def main():
    # Параметры подключения (из условия задачи)
    config = {
        'host': 'nlbotinterface.ru',
        'port': 3306,
        'database': 'bitcoin_tickers',
        'user': 'bitcoin',
        'password': 'g49020007',
        'ssl_disabled': True
    }
    tables = ['tickers', 'tickers_1D', 'tickers_1H']

    # Устанавливаем соединение
    conn = mysql.connector.connect(**config)
    cursor = conn.cursor(dictionary=True)

    try:
        for table in tables:
            print(f"\n--- Обработка таблицы {table} ---")
            cursor.execute(f"SELECT ticker, Date, Time FROM {table}")
            rows = cursor.fetchall()
            print(f"Найдено строк: {len(rows)}")

            updated_count = 0
            for row in rows:
                old_ticker = row['ticker']
                data_str = row['Date']
                time_str = row['Time']

                # Исправляем формат даты
                new_data_str = fix_date_format(data_str)
                if new_data_str is None:
                    print(f"Предупреждение: строка с нераспознанным форматом даты пропущена: {data_str}")
                    continue

                # Если дата уже правильная – ничего не делаем (предполагаем, что timestamp верен)
                if new_data_str == data_str:
                    continue

                # Парсим дату и время
                try:
                    dt = datetime.strptime(f"{new_data_str} {time_str}", "%Y.%m.%d %H:%M")
                except ValueError as e:
                    print(f"Ошибка разбора даты/времени для строки {row}: {e}")
                    continue

                # Вычисляем новый Unix timestamp (секунды с 1970-01-01 UTC)
                new_ticker = int(dt.timestamp())

                # Обновляем запись. Идентифицируем строку по старому ticker, Data и Time
                update_query = f"""
                    UPDATE {table}
                    SET Date = %s, ticker = %s
                    WHERE ticker = %s AND Date = %s AND Time = %s
                """
                cursor.execute(update_query, (new_data_str, new_ticker, old_ticker, data_str, time_str))

                if cursor.rowcount == 1:
                    updated_count += 1
                else:
                    print(f"Предупреждение: обновление затронуло {cursor.rowcount} строк (ожидалось 1) для "
                          f"ticker={old_ticker}, Data={data_str}, Time={time_str}")

            conn.commit()
            print(f"Обновлено строк в таблице {table}: {updated_count}")

    except Exception as e:
        print(f"Ошибка при выполнении: {e}")
        conn.rollback()
    finally:
        cursor.close()
        conn.close()

if __name__ == "__main__":
    main()