#ifndef SPECIFICATIONPCBCONTROLLER_H
#define SPECIFICATIONPCBCONTROLLER_H

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

class ComponentModel;
class MainController;

class SpecificationPCBController : public QObject
{
    Q_OBJECT

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

    // Получение модели для отображения в UI
    SpecificationPCBTableModel* getTableModel() const { return m_tableModel; }
    SpecificationPCBTableModel* 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);
    
    // Метод для установки модели таблицы (для интеграции с SpecificationPCBProcessor)
    void setModel(SpecificationPCBTableModel *model);
    
    // Метод для установки модели настроек проекта
    void setProjectSettingsModel(ProjectSettingsModel *model);
    void setMainController(MainController *controller);
    
    // Метод для оптимизации разрывов страниц
    void optimizePageBreaks();
    
    // Метод для перерасчета позиций (начинает с последнего значения + 1)
    void recalculatePositions();
    
    // Методы для работы с размером шрифта
    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);
    
    // Методы для работы с названием платы
    QString getBoardName() const;
    void setBoardName(const QString &value);
    
    // Методы для работы с именем PcbDoc файла
    void setPcbDocFileName(const QString &fileName);
    QString getPcbDocFileName() const;

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

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

    // Методы для специфичной логики спецификации платы
    QString getComponentFormat(ComponentModel *component);
    QString getComponentZone(ComponentModel *component);
    QString getComponentPosition(ComponentModel *component);

    SpecificationPCBTableModel *m_tableModel;
    DesignatorMappingModel *m_designatorMappingModel;
    ProjectSettingsModel *m_projectSettingsModel;
    MainController *m_mainController;
    QList<ComponentModel*> m_components;
    QStringList m_columnMappings;
    QStringList m_propertyNames;
    QString m_pcbDocFileName; // Имя PcbDoc файла
};

#endif // SPECIFICATIONPCBCONTROLLER_H 
