#!/usr/bin/env python3
"""
Скрипт для управления административными учетными записями OldMarket
"""

import sys
import os
import sqlite3
from getpass import getpass
import hashlib
from datetime import datetime

# Добавляем путь к текущей директории для импорта моделей
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

def hash_password(password: str) -> str:
    """Хеширование пароля"""
    return hashlib.sha256(password.encode()).hexdigest()

def get_db_connection():
    """Подключение к базе данных"""
    db_path = "oldmarket.db"
    if not os.path.exists(db_path):
        print(f"❌ База данных {db_path} не найдена!")
        sys.exit(1)
    
    return sqlite3.connect(db_path)

def list_admins():
    """Показать список всех администраторов"""
    conn = get_db_connection()
    cursor = conn.cursor()
    
    cursor.execute("SELECT id, username, created_at FROM admin_users ORDER BY id")
    admins = cursor.fetchall()
    
    if not admins:
        print("📭 В системе нет администраторов")
        return
    
    print("\n📋 Список администраторов:")
    print("-" * 50)
    print(f"{'ID':<3} {'Имя пользователя':<20} {'Дата создания'}")
    print("-" * 50)
    
    for admin in admins:
        admin_id, username, created_at = admin
        print(f"{admin_id:<3} {username:<20} {created_at}")

def create_admin():
    """Создать нового администратора"""
    print("\n👤 Создание нового администратора")
    
    username = input("Введите имя пользователя: ").strip()
    if not username:
        print("❌ Имя пользователя не может быть пустым!")
        return
    
    password = getpass("Введите пароль: ")
    if not password:
        print("❌ Пароль не может быть пустым!")
        return
    
    confirm_password = getpass("Подтвердите пароль: ")
    if password != confirm_password:
        print("❌ Пароли не совпадают!")
        return
    
    conn = get_db_connection()
    cursor = conn.cursor()
    
    # Проверяем, существует ли пользователь
    cursor.execute("SELECT id FROM admin_users WHERE username = ?", (username,))
    if cursor.fetchone():
        print(f"❌ Пользователь '{username}' уже существует!")
        conn.close()
        return
    
    # Создаем нового администратора
    password_hash = hash_password(password)
    created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    cursor.execute(
        "INSERT INTO admin_users (username, password_hash, created_at) VALUES (?, ?, ?)",
        (username, password_hash, created_at)
    )
    
    conn.commit()
    conn.close()
    
    print(f"✅ Администратор '{username}' успешно создан!")

def delete_admin():
    """Удалить администратора"""
    list_admins()
    
    admin_id = input("\nВведите ID администратора для удаления: ").strip()
    if not admin_id.isdigit():
        print("❌ ID должен быть числом!")
        return
    
    conn = get_db_connection()
    cursor = conn.cursor()
    
    # Получаем информацию об администраторе
    cursor.execute("SELECT username FROM admin_users WHERE id = ?", (admin_id,))
    admin = cursor.fetchone()
    
    if not admin:
        print(f"❌ Администратор с ID {admin_id} не найден!")
        conn.close()
        return
    
    username = admin[0]
    
    # Подтверждение удаления
    confirm = input(f"⚠️  Вы уверены, что хотите удалить администратора '{username}' (ID: {admin_id})? (y/N): ")
    if confirm.lower() != 'y':
        print("❌ Удаление отменено")
        conn.close()
        return
    
    # Удаляем администратора
    cursor.execute("DELETE FROM admin_users WHERE id = ?", (admin_id,))
    conn.commit()
    conn.close()
    
    print(f"✅ Администратор '{username}' успешно удален!")

def change_password():
    """Изменить пароль администратора"""
    list_admins()
    
    admin_id = input("\nВведите ID администратора для смены пароля: ").strip()
    if not admin_id.isdigit():
        print("❌ ID должен быть числом!")
        return
    
    conn = get_db_connection()
    cursor = conn.cursor()
    
    # Проверяем существование администратора
    cursor.execute("SELECT username FROM admin_users WHERE id = ?", (admin_id,))
    admin = cursor.fetchone()
    
    if not admin:
        print(f"❌ Администратор с ID {admin_id} не найден!")
        conn.close()
        return
    
    username = admin[0]
    
    # Запрашиваем новый пароль
    new_password = getpass(f"Введите новый пароль для '{username}': ")
    if not new_password:
        print("❌ Пароль не может быть пустым!")
        conn.close()
        return
    
    confirm_password = getpass("Подтвердите новый пароль: ")
    if new_password != confirm_password:
        print("❌ Пароли не совпадают!")
        conn.close()
        return
    
    # Обновляем пароль
    new_password_hash = hash_password(new_password)
    cursor.execute(
        "UPDATE admin_users SET password_hash = ? WHERE id = ?",
        (new_password_hash, admin_id)
    )
    
    conn.commit()
    conn.close()
    
    print(f"✅ Пароль для администратора '{username}' успешно изменен!")

def reset_default_admin():
    """Сбросить пароль дефолтного администратора"""
    print("\n🔄 Сброс пароля дефолтного администратора")
    
    conn = get_db_connection()
    cursor = conn.cursor()
    
    # Проверяем существование администратора 'admin'
    cursor.execute("SELECT id FROM admin_users WHERE username = 'admin'")
    admin = cursor.fetchone()
    
    if not admin:
        # Создаем дефолтного администратора
        password_hash = hash_password("admin123")
        created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        
        cursor.execute(
            "INSERT INTO admin_users (username, password_hash, created_at) VALUES (?, ?, ?)",
            ("admin", password_hash, created_at)
        )
        
        conn.commit()
        conn.close()
        
        print("✅ Дефолтный администратор 'admin' создан!")
        print("🔑 Логин: admin")
        print("🔑 Пароль: admin123")
        print("⚠️  Смените пароль после первого входа!")
        return
    
    # Сбрасываем пароль
    new_password = "admin123"
    new_password_hash = hash_password(new_password)
    
    cursor.execute(
        "UPDATE admin_users SET password_hash = ? WHERE username = 'admin'",
        (new_password_hash,)
    )
    
    conn.commit()
    conn.close()
    
    print("✅ Пароль дефолтного администратора сброшен!")
    print("🔑 Логин: admin")
    print("🔑 Пароль: admin123")
    print("⚠️  Смените пароль после входа!")

def show_menu():
    """Показать меню управления"""
    print("\n" + "="*50)
    print("👑 УПРАВЛЕНИЕ АДМИНИСТРАТОРАМИ OLDMARKET")
    print("="*50)
    print("1. 📋 Список администраторов")
    print("2. 👤 Создать администратора")
    print("3. 🗑️  Удалить администратора")
    print("4. 🔑 Изменить пароль")
    print("5. 🔄 Сбросить дефолтного администратора")
    print("6. ❌ Выход")
    print("="*50)

def main():
    """Главная функция"""
    try:
        while True:
            show_menu()
            choice = input("\nВыберите действие (1-6): ").strip()
            
            if choice == '1':
                list_admins()
            elif choice == '2':
                create_admin()
            elif choice == '3':
                delete_admin()
            elif choice == '4':
                change_password()
            elif choice == '5':
                reset_default_admin()
            elif choice == '6':
                print("\n👋 До свидания!")
                break
            else:
                print("❌ Неверный выбор! Попробуйте снова.")
            
            input("\nНажмите Enter для продолжения...")
    
    except KeyboardInterrupt:
        print("\n\n👋 Программа прервана пользователем!")
    except Exception as e:
        print(f"\n❌ Произошла ошибка: {e}")

if __name__ == "__main__":
    main()