#include "projectsettingsmodel.h"
#include <QDebug>

// Статические константы
const QStringList ProjectSettingsModel::DEFAULT_COLUMN_MAPPINGS = QStringList() 
    << "Designator" << "<Пусто>" << "<Пусто>" << "<Пусто>";
const QString ProjectSettingsModel::DEFAULT_VARIANT = "No Variations";

ProjectSettingsModel::ProjectSettingsModel(QObject *parent)
    : QObject{parent}
    , m_currentVariant(DEFAULT_VARIANT)
    , m_columnMappings(DEFAULT_COLUMN_MAPPINGS)
    , m_isModified(false)
    , m_databaseController(nullptr)
{
    qDebug() << "ProjectSettingsModel: Инициализация модели настроек проекта";
}

QString ProjectSettingsModel::currentVariant() const
{
    return m_currentVariant;
}

void ProjectSettingsModel::setCurrentVariant(const QString &newCurrentVariant)
{
    if (m_currentVariant == newCurrentVariant)
        return;
    
    qDebug() << "ProjectSettingsModel: Устанавливаем текущий вариант:" << newCurrentVariant;
    
    m_currentVariant = newCurrentVariant;
    setModified(true);
    emit currentVariantChanged();
}

QStringList ProjectSettingsModel::columnMappings() const
{
    return m_columnMappings;
}

void ProjectSettingsModel::setColumnMappings(const QStringList &newColumnMappings)
{
    if (m_columnMappings == newColumnMappings)
        return;
    
    qDebug() << "ProjectSettingsModel: Устанавливаем настройки столбцов:" << newColumnMappings;
    
    m_columnMappings = newColumnMappings;
    setModified(true);
    emit columnMappingsChanged();
}

QStringList ProjectSettingsModel::availableVariants() const
{
    return m_availableVariants;
}

void ProjectSettingsModel::setAvailableVariants(const QStringList &newAvailableVariants)
{
    if (m_availableVariants == newAvailableVariants)
        return;
    
    qDebug() << "ProjectSettingsModel: Устанавливаем доступные варианты:" << newAvailableVariants;
    
    m_availableVariants = newAvailableVariants;
    emit availableVariantsChanged();
}

QStringList ProjectSettingsModel::availableProperties() const
{
    return m_availableProperties;
}

void ProjectSettingsModel::setAvailableProperties(const QStringList &newAvailableProperties)
{
    if (m_availableProperties == newAvailableProperties)
        return;
    
    qDebug() << "ProjectSettingsModel: Устанавливаем доступные свойства:" << newAvailableProperties;
    
    m_availableProperties = newAvailableProperties;
    emit availablePropertiesChanged();
}

void ProjectSettingsModel::resetToDefaults()
{
    qDebug() << "ProjectSettingsModel: Сброс настроек к значениям по умолчанию";
    
    setCurrentVariant(DEFAULT_VARIANT);
    setColumnMappings(DEFAULT_COLUMN_MAPPINGS);
    setModified(false);
}

bool ProjectSettingsModel::isModified() const
{
    return m_isModified;
}

void ProjectSettingsModel::setModified(bool modified)
{
    if (m_isModified == modified)
        return;
    
    m_isModified = modified;
    if (modified) {
        emit settingsModified();
    }
}

// Методы для работы с настройками маппинга для разных типов документов
void ProjectSettingsModel::setColumnMapping(const QString &documentType, int columnIndex, const QString &propertyName)
{
    QString key = QString("%1_%2").arg(documentType).arg(columnIndex);
    
    if (m_columnMappingSettings.value(key) != propertyName) {
        qDebug() << "ProjectSettingsModel::setColumnMapping: Устанавливаем маппинг" << key << "=" << propertyName;
        m_columnMappingSettings[key] = propertyName;
        setModified(true);
    }
}

QString ProjectSettingsModel::getColumnMapping(const QString &documentType, int columnIndex) const
{
    QString key = QString("%1_%2").arg(documentType).arg(columnIndex);
    QString value = m_columnMappingSettings.value(key);
    qDebug() << "ProjectSettingsModel::getColumnMapping: Получаем маппинг" << key << "=" << value;
    return value;
}

QStringList ProjectSettingsModel::getColumnMappings(const QString &documentType) const
{
    QStringList mappings;
    QString prefix = QString("%1_").arg(documentType);
    
    // Собираем все маппинги для данного типа документа
    QMap<int, QString> tempMappings;
    for (auto it = m_columnMappingSettings.begin(); it != m_columnMappingSettings.end(); ++it) {
        if (it.key().startsWith(prefix)) {
            // Извлекаем индекс колонки из ключа
            QString suffix = it.key().mid(prefix.length());
            bool ok;
            int columnIndex = suffix.toInt(&ok);
            if (ok) {
                tempMappings[columnIndex] = it.value();
            }
        }
    }
    
    // Сортируем по индексу колонки и формируем список
    for (auto it = tempMappings.begin(); it != tempMappings.end(); ++it) {
        while (mappings.size() <= it.key()) {
            mappings.append(QString()); // Добавляем пустые строки для пропущенных индексов
        }
        mappings[it.key()] = it.value();
    }
    
    qDebug() << "ProjectSettingsModel::getColumnMappings: Получены маппинги для" << documentType << ":" << mappings;
    return mappings;
}

void ProjectSettingsModel::clearColumnMappings(const QString &documentType)
{
    QString prefix = QString("%1_").arg(documentType);
    
    // Удаляем все маппинги для данного типа документа
    QList<QString> keysToRemove;
    for (auto it = m_columnMappingSettings.begin(); it != m_columnMappingSettings.end(); ++it) {
        if (it.key().startsWith(prefix)) {
            keysToRemove.append(it.key());
        }
    }
    
    for (const QString &key : keysToRemove) {
        m_columnMappingSettings.remove(key);
    }
    
    if (!keysToRemove.isEmpty()) {
        qDebug() << "ProjectSettingsModel::clearColumnMappings: Удалены маппинги для" << documentType;
        setModified(true);
    }
}

void ProjectSettingsModel::setDatabaseController(DataBaseController *controller)
{
    m_databaseController = controller;
    qDebug() << "ProjectSettingsModel::setDatabaseController: Установлен контроллер БД";
}

// Методы для работы с размером шрифта для разных типов документов
void ProjectSettingsModel::setFontSize(const QString &documentType, int fontSize)
{
    if (m_fontSizes.value(documentType, 12) != fontSize) {
        qDebug() << "ProjectSettingsModel::setFontSize: Устанавливаем размер шрифта для" << documentType << "=" << fontSize;
        m_fontSizes[documentType] = fontSize;
        setModified(true);
    }
}

int ProjectSettingsModel::getFontSize(const QString &documentType) const
{
    int fontSize = m_fontSizes.value(documentType, 12); // По умолчанию 12
    qDebug() << "ProjectSettingsModel::getFontSize: Размер шрифта для" << documentType << "=" << fontSize;
    return fontSize;
}

// Методы для работы с поджимом по ширине
void ProjectSettingsModel::setFontStretch(const QString &documentType, int stretch)
{
    if (m_fontStretches.value(documentType, 100) != stretch) {
        qDebug() << "ProjectSettingsModel::setFontStretch: Устанавливаем поджим для" << documentType << "=" << stretch;
        m_fontStretches[documentType] = stretch;
        setModified(true);
    }
}

int ProjectSettingsModel::getFontStretch(const QString &documentType) const
{
    int stretch = m_fontStretches.value(documentType, 100); // По умолчанию 100 (нормальный)
    qDebug() << "ProjectSettingsModel::getFontStretch: Поджим для" << documentType << "=" << stretch;
    return stretch;
} 