#!/usr/bin/env python3
"""
Скрипт для создания пользователя администратора в автономной PACS системе.
Используется для первоначальной настройки системы.
"""

import sys
import argparse
import logging
from pathlib import Path

# Добавляем путь к проекту
sys.path.insert(0, str(Path(__file__).parent))

from dbmodel import User, pacs_db
import bcrypt

# Настройка логирования
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)


def hash_password(password: str) -> str:
    """Хеширует пароль с помощью bcrypt"""
    salt = bcrypt.gensalt(rounds=12)
    hashed = bcrypt.hashpw(password.encode('utf-8'), salt)
    return hashed.decode('utf-8')


def create_admin_user(login: str, password: str, 
                     last_name: str = "Администратор", 
                     first_name: str = "Системы",
                     patr_name: str = "") -> bool:
    """
    Создает пользователя администратора.
    
    Args:
        login: Логин пользователя
        password: Пароль (будет захеширован)
        last_name: Фамилия
        first_name: Имя
        patr_name: Отчество
        
    Returns:
        True если успешно, False если ошибка
    """
    try:
        # Подключаемся к базе данных
        pacs_db.connect()
        # Проверяем, существует ли уже пользователь
        existing_user = User.get_or_none(User.login == login)
        if existing_user:
            logger.info(f"Пользователь '{login}' уже существует (ID: {existing_user.id})")
            
            # Предлагаем обновить пароль
            response = input(f"Обновить пароль для пользователя '{login}'? (y/N): ")
            if response.lower() == 'y':
                existing_user.passwd = hash_password(password)
                existing_user.save()
                logger.info(f"Пароль для пользователя '{login}' обновлен")
            return True
        
        # Создаем нового пользователя
        user = User(
            login=login,
            last_name=last_name,
            first_name=first_name,
            patr_name=patr_name,
            is_admin=True
        )
        user.passwd = hash_password(password)
        user.save()
        
        logger.info(f"Пользователь администратора создан успешно:")
        logger.info(f"  ID: {user.id}")
        logger.info(f"  Логин: {login}")
        logger.info(f"  ФИО: {last_name} {first_name} {patr_name}")
        logger.info(f"  Права: Администратор")
        
        return True
        
    except Exception as e:
        logger.error(f"Ошибка при создании пользователя: {e}")
        return False
    finally:
        if not pacs_db.is_closed():
            pacs_db.close()


def list_users():
    """Выводит список всех пользователей"""
    try:
        # Подключаемся к базе данных
        pacs_db.connect()
        users = User.select().order_by(User.id)
        
        if not users:
            logger.info("В системе нет пользователей")
            return
        
        logger.info("Список пользователей:")
        for user in users:
            logger.info(f"  ID: {user.id}, Логин: {user.login}, "
                       f"ФИО: {user.last_name} {user.first_name} {user.patr_name}, "
                       f"Админ: {'Да' if user.is_admin else 'Нет'}")
        
    except Exception as e:
        logger.error(f"Ошибка при получении списка пользователей: {e}")
    finally:
        if not pacs_db.is_closed():
            pacs_db.close()


def change_password(login: str, new_password: str) -> bool:
    """Изменяет пароль пользователя"""
    try:
        # Подключаемся к базе данных
        pacs_db.connect()
        user = User.get_or_none(User.login == login)
        if not user:
            logger.error(f"Пользователь '{login}' не найден")
            return False
        
        user.passwd = hash_password(new_password)
        user.save()
        
        logger.info(f"Пароль для пользователя '{login}' изменен")
        return True
        
    except Exception as e:
        logger.error(f"Ошибка при изменении пароля: {e}")
        return False
    finally:
        if not pacs_db.is_closed():
            pacs_db.close()


def main():
    parser = argparse.ArgumentParser(description='Управление пользователями автономной PACS системы')
    subparsers = parser.add_subparsers(dest='command', help='Команда')
    
    # Команда создания администратора
    create_parser = subparsers.add_parser('create', help='Создать пользователя администратора')
    create_parser.add_argument('--login', default='admin', help='Логин (по умолчанию: admin)')
    create_parser.add_argument('--password', default='admin', help='Пароль (по умолчанию: admin)')
    create_parser.add_argument('--last-name', default='Администратор', help='Фамилия')
    create_parser.add_argument('--first-name', default='Системы', help='Имя')
    create_parser.add_argument('--patr-name', default='', help='Отчество')
    
    # Команда списка пользователей
    subparsers.add_parser('list', help='Показать список пользователей')
    
    # Команда изменения пароля
    change_parser = subparsers.add_parser('change-password', help='Изменить пароль пользователя')
    change_parser.add_argument('--login', required=True, help='Логин пользователя')
    change_parser.add_argument('--new-password', required=True, help='Новый пароль')
    
    args = parser.parse_args()
    
    if not args.command:
        parser.print_help()
        return 1
    
    try:
        if args.command == 'create':
            success = create_admin_user(
                login=args.login,
                password=args.password,
                last_name=args.last_name,
                first_name=args.first_name,
                patr_name=args.patr_name
            )
            
            if success:
                logger.warning(f"ВАЖНО: Пароль по умолчанию '{args.password}' - рекомендуется сменить!")
                logger.info("Используйте команду 'change-password' для смены пароля")
            return 0 if success else 1
            
        elif args.command == 'list':
            list_users()
            return 0
            
        elif args.command == 'change-password':
            success = change_password(args.login, args.new_password)
            return 0 if success else 1
            
    except KeyboardInterrupt:
        logger.info("Операция прервана пользователем")
        return 1
    except Exception as e:
        logger.error(f"Неожиданная ошибка: {e}")
        return 1


if __name__ == '__main__':
    sys.exit(main())