#ifndef SPECIFICATIONCONTROLLER_H
#define SPECIFICATIONCONTROLLER_H

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

class PCBMaterialModel;
class MainController;

class SpecificationController : public QObject
{
    Q_OBJECT

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

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

    // Методы для работы с материалами
    void setMaterials(const QList<PCBMaterialModel*> &materials);
    void setPCBMaterialModel(PCBMaterialModel* model);
    void generateTableFromMaterials();
    void updateTableFromMaterials(); // Метод для обновления таблицы по кнопке

    // Новые методы для управления строками
    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);
    
    // Метод для установки модели таблицы (для интеграции с SpecificationProcessor)
    void setModel(SpecificationTableModel *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);
    
    // Методы для работы с децимальными номерами
    QString getDecimalNumberBoard() const;
    void setDecimalNumberBoard(const QString &value);
    QString getDecimalNumberDocument() const;
    void setDecimalNumberDocument(const QString &value);

private:
    QString getMaterialValue(PCBMaterialModel *material, const QString &propertyName);
    QString parseExpression(PCBMaterialModel *material, const QString &expression);
    QString formatDielType(int dielType);
    QStringList collectPropertyNames();
    
    // Методы для группировки
    QString getMaterialType(PCBMaterialModel *material);
    
    // Метод для разделения десигнатора на буквенную и цифровую части
    QPair<QString, QString> splitDesignator(const QString &designator);

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

    // Методы для специфичной логики спецификации
    QString getMaterialFormat(PCBMaterialModel *material);
    QString getMaterialZone(PCBMaterialModel *material);
    QString getMaterialPosition(PCBMaterialModel *material);

    SpecificationTableModel *m_tableModel;
    DesignatorMappingModel *m_designatorMappingModel;
    ProjectSettingsModel *m_projectSettingsModel;
    MainController *m_mainController;
    QList<PCBMaterialModel*> m_materials;
    PCBMaterialModel *m_pcbMaterialModel;
    QStringList m_columnMappings;
    QStringList m_propertyNames;
};

#endif // SPECIFICATIONCONTROLLER_H 