#ifndef VEDOMOSTCONTROLLER_H
#define VEDOMOSTCONTROLLER_H

#include <QObject>
#include <QList>
#include <QStringList>
#include "../model/vedomosttablemodel.h"
#include "../model/designatormappingmodel.h"
#include "../model/projectsettingsmodel.h"

class ComponentModel;
class MainController;

class VedomostController : public QObject
{
    Q_OBJECT

public:
    explicit VedomostController(QObject *parent = nullptr);
    ~VedomostController();

    // Получение модели для отображения в UI
    VedomostTableModel* getTableModel() const { return m_tableModel; }
    VedomostTableModel* getModel() const { return m_tableModel; } // Алиас для совместимости

    // Методы для работы с компонентами
    void setComponents(const QList<ComponentModel*> &components);
    void generateTableFromComponents();
    void updateTableFromComponents(); // Метод для обновления таблицы по кнопке

    // Новые методы для управления строками
    void addEmptyRow();
    void addEmptyRowAt(int position);
    void insertEmptyRowAt(int position); // Вставка строки в определенную позицию
    void removeRow(int row);
    void clearTable();

    // Методы для работы с настройками
    void setColumnMappings(const QStringList &mappings);
    QStringList getColumnMappings() const;
    QStringList getAvailableProperties() const;
    
    // Метод для установки модели маппинга дезигнаторов
    void setDesignatorMappingModel(DesignatorMappingModel *mappingModel);
    
    // Метод для установки модели таблицы (для интеграции с VedomostProcessor)
    void setModel(VedomostTableModel *model);
    
    // Метод для установки модели настроек проекта
    void setProjectSettingsModel(ProjectSettingsModel *model);
    
    // Метод для установки главного контроллера
    void setMainController(MainController *controller);
    
    // Метод для оптимизации разрывов страниц
    void optimizePageBreaks();
    
    // Методы для работы с размером шрифта
    int getFontSize() const;
    void setFontSize(int fontSize);
    int getFontStretch() const;
    void setFontStretch(int stretch);

private:
    QString getComponentValue(ComponentModel *component, const QString &propertyName);
    QString getComponentRawValue(ComponentModel *component, const QString &propertyName); // Получает сырое значение без вычисления выражений
    QString getMappedValue(ComponentModel *component, const QString &columnName);
    QString parseExpression(ComponentModel *component, const QString &expression);
    QStringList collectPropertyNames();
    
    // Методы для группировки
    QString getComponentType(ComponentModel *component);
    QString getComponentTypeName(ComponentModel *component); // Название элемента в единственном числе
    
    // Метод для разделения десигнатора на буквенную и цифровую части
    QPair<QString, QString> splitDesignator(const QString &designator);

    // Метод для разделения длинных наименований на несколько строк
    QList<QString> splitLongDesignation(const QString &designation, const QString originalString="", ComponentModel *component = nullptr, int maxLength = 60);
    
    // Вспомогательный метод для разделения текста по пробелам
    QList<QString> splitBySpaces(const QString &text, int maxLength);
    
    // Вспомогательный метод для разделения текста по соединениям
    QList<QString> splitByConnectors(const QString &text, int maxLength);
    
    // Вспомогательный метод для разделения комплексной строки (с запятыми) по середине
    QList<QString> splitComplexStringByMiddle(const QString &text, int maxLength);
    
    // Метод для разбиения длинных групп десигнаторов
    QStringList splitDesignatorGroups(const QStringList &designatorGroups, int maxLength = 30);

    // Метод для получения значения "Куда входит" из ProjectParamTable
    QString getWhereUsed() const;

private slots:
    // Слот для обработки изменений данных в строке (автоматический пересчет totalQuantity)
    void onRowDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());

private:
    VedomostTableModel *m_tableModel;
    DesignatorMappingModel *m_designatorMappingModel;
    ProjectSettingsModel *m_projectSettingsModel;
    MainController *m_mainController;
    QList<ComponentModel*> m_components;
    QStringList m_columnMappings;
    QStringList m_propertyNames;
};

#endif // VEDOMOSTCONTROLLER_H 