#!/usr/bin/env python3
"""
Скрипт миграции для создания таблиц PACS.
Создает все таблицы PACS и проверяет/добавляет необходимые поля.

Параметры:
  --debug    Включить отладочный вывод peewee
  --help     Показать справку
"""

import sys
import logging
import argparse
from pathlib import Path

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

from dbmodel import pacs_db, User, UserToken, Worklist, StudyDescription, Patient, Study, Series, Instance, SendLog, migrator
from config import config
import bcrypt
from playhouse.migrate import migrate
from peewee import IntegerField

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


def check_fields(db):
    """Проверяет и добавляет необходимые поля в существующие таблицы"""
    try:
        logger.info("Проверка полей в таблицах...")
        
        # Проверяем поле deleted в таблице user
        cols = db.get_columns('user')
        found = False
        for col in cols:
            if col.name == 'deleted':
                found = True
                break
        if not found:
            logger.info("Добавление поля deleted в таблицу user...")
            from peewee import BooleanField
            migrate(
                migrator.add_column('user', 'deleted', BooleanField(default=False))
            )
            logger.info("Поле deleted добавлено в user")
        
        # Проверяем поле size в таблице instance
        cols = db.get_columns('instance')
        found = False
        for col in cols:
            if col.name == 'size':
                found = True
                break
        if not found:
            logger.info("Добавление поля size в таблицу instance...")
            migrate(
                migrator.add_column('instance', 'size', IntegerField(default=0))
            )
            logger.info("Поле size добавлено в instance")
        
        # Проверяем поле size в таблице series
        cols = db.get_columns('series')
        found = False
        for col in cols:
            if col.name == 'size':
                found = True
                break
        if not found:
            logger.info("Добавление поля size в таблицу series...")
            migrate(
                migrator.add_column('series', 'size', IntegerField(default=0))
            )
            logger.info("Поле size добавлено в series")
        
        # Проверяем поле size в таблице study
        cols = db.get_columns('study')
        found = False
        for col in cols:
            if col.name == 'size':
                found = True
                break
        if not found:
            logger.info("Добавление поля size в таблицу study...")
            migrate(
                migrator.add_column('study', 'size', IntegerField(default=0))
            )
            logger.info("Поле size добавлено в study")
        
        logger.info("Проверка полей завершена")
        return True
        
    except Exception as e:
        logger.error(f"Ошибка при проверке полей: {e}")
        return False


def create_tables(db):
    """Создает все таблицы PACS в правильном порядке"""
    logger.info("Создание таблиц PACS...")
    
    try:
        # Создаем таблицы в правильном порядке зависимостей
        # 1. Основные таблицы PACS (Patient → Study → Series → Instance)
        logger.info("Создание основных таблиц PACS...")
        db.create_tables([Patient], safe=True)
        db.create_tables([Study], safe=True)
        db.create_tables([Series], safe=True)
        db.create_tables([Instance], safe=True)
        db.create_tables([SendLog], safe=True)
        
        # 2. Таблицы пользователей и worklist
        logger.info("Создание таблиц пользователей и worklist...")
        db.create_tables([User], safe=True)
        db.create_tables([UserToken], safe=True)
        db.create_tables([Worklist], safe=True)
        db.create_tables([StudyDescription], safe=True)
        
        logger.info("Все таблицы созданы успешно")
        return True
        
    except Exception as e:
        logger.error(f"Ошибка при создании таблиц: {e}")
        return False


def create_admin_user(db, login='admin', password='admin'):
    """Создает пользователя администратора по умолчанию"""
    try:
        # Проверяем, существует ли уже администратор
        existing_user = User.get_or_none(User.login == login)
        if existing_user:
            logger.info(f"Пользователь '{login}' уже существует (ID: {existing_user.id})")
            return True
        
        # Создаем администратора
        admin = User(
            login=login,
            last_name='Администратор',
            first_name='Системы',
            patr_name='',
            is_admin=True
        )
        admin.passwd = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt(rounds=12)).decode('utf-8')
        admin.save()
        
        logger.info(f"Пользователь администратора '{login}' создан")
        logger.warning(f"Пароль по умолчанию: '{password}' - рекомендуется сменить!")
        return True
        
    except Exception as e:
        logger.error(f"Ошибка при создании администратора: {e}")
        return False


def main():
    """Основная функция миграции"""
    parser = argparse.ArgumentParser(description='Миграция базы данных PACS')
    parser.add_argument('--debug', action='store_true', help='Включить отладочный вывод peewee')
    args = parser.parse_args()
    
    # Включаем дебаг для peewee если нужно
    if args.debug:
        peewee_logger = logging.getLogger('peewee')
        peewee_logger.setLevel(logging.DEBUG)
        peewee_logger.addHandler(logging.StreamHandler())
        logger.info("Отладочный режим peewee включен")
    
    logger.info("Начало миграции PACS")
    logger.info(f"База данных: {config.mysql.host}:{config.mysql.port}/{config.mysql.db}")
    
    try:
        # Подключаемся к базе данных
        pacs_db.connect()
        
        # Создаем таблицы
        if not create_tables(pacs_db):
            logger.error("Не удалось создать таблицы")
            return 1
        
        # Проверяем и добавляем необходимые поля в таблицы
        logger.info("Проверка полей в таблицах...")
        if not check_fields(pacs_db):
            logger.error("Не удалось проверить/добавить поля")
            return 1
        
        # Создаем администратора
        logger.info("Создание пользователя администратора...")
        if not create_admin_user(pacs_db):
            logger.error("Не удалось создать администратора")
            return 1
        
        logger.info("Миграция завершена успешно!")
        logger.info("Рекомендации:")
        logger.info("1. Сменить пароль администратора (по умолчанию: admin)")
        logger.info("2. Создать дополнительных пользователей через API")
        logger.info("3. Настроить worklist через API")
        
        return 0
        
    except Exception as e:
        logger.error(f"Критическая ошибка при миграции: {e}")
        return 1
    finally:
        if not pacs_db.is_closed():
            pacs_db.close()


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