#ifndef SPECIFICATIONTABLEMODEL_H
#define SPECIFICATIONTABLEMODEL_H

#include <QAbstractTableModel>
#include <QObject>
#include <QString>
#include <QList>
#include <QMap>
#include <QSet>
#include <QPair>

// Forward declaration
class PCBMaterialModel;

// Forward declaration структуры для информации о переносе заголовков
struct PageBreakInfo;

// Структура для хранения данных ячейки спецификации
struct SpecificationCellData
{
    QString value;           // Значение ячейки
    int rowNumber;          // Номер строки в документе
    int pageNumber;         // Номер страницы
    bool isHeader;          // Является ли заголовком
    bool isAutoGenerated;   // Автоматически сгенерированное значение
    bool isEmpty;           // Пустая ячейка
    int stretch;            // Поджим по ширине (100 = нормальный, по умолчанию 100)
    bool isUnderline;       // Подчеркивать ли текст (по умолчанию true для заголовков)
    
    SpecificationCellData() : rowNumber(0), pageNumber(1), isHeader(false), 
                             isAutoGenerated(false), isEmpty(true), stretch(100), isUnderline(false) {}
    
    SpecificationCellData(const QString &val, int row = 0, int page = 1, 
                         bool header = false, bool autoGen = false, bool empty = false, int cellStretch = 100, bool underline = false)
        : value(val), rowNumber(row), pageNumber(page), isHeader(header),
          isAutoGenerated(autoGen), isEmpty(empty), stretch(cellStretch), isUnderline(underline) {}
};

// Структура для хранения строки таблицы спецификации
struct SpecificationRowData
{
    SpecificationCellData format;      // Формат
    SpecificationCellData zone;        // Зона
    SpecificationCellData position;    // Позиция
    SpecificationCellData designation; // Обозначение
    SpecificationCellData name;        // Наименование
    SpecificationCellData quantity;    // Количество
    SpecificationCellData note;        // Примечание
    bool isHeader;                     // Является ли заголовком
    bool isEmpty;                      // Пустая строка
    int rowNumber;                     // Номер строки в документе
    int pageNumber;                    // Номер страницы
    
    SpecificationRowData() : isHeader(false), isEmpty(false), rowNumber(0), pageNumber(1) {}
};

class SpecificationTableModel : public QAbstractTableModel
{
    Q_OBJECT
    Q_PROPERTY(QStringList columnMappings READ columnMappings WRITE setColumnMappings NOTIFY columnMappingsChanged FINAL)
    
public:
    explicit SpecificationTableModel(QObject *parent = nullptr);
    
    // Константы для разбивки на страницы
    static const int ROWS_PER_FIRST_PAGE = 27;
    static const int ROWS_PER_OTHER_PAGE = 33;
    
    // Методы QAbstractTableModel
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
    Qt::ItemFlags flags(const QModelIndex &index) const override;
    
    // Методы для работы с данными
    void setColumnMappings(const QStringList &mappings);
    QStringList columnMappings() const;
    
    // Методы для работы со строками
    void addRow(const SpecificationRowData &rowData);
    void insertRow(int position, const SpecificationRowData &rowData);
    void removeRow(int row);
    void clear();
    
    // Новые методы для управления строками
    void addEmptyRow();
    void addEmptyRowAt(int position);
    SpecificationRowData createEmptyRow() const;
    bool canEditRow(int row) const;
    
    // Методы для работы с материалами
    void setMaterials(const QList<PCBMaterialModel*> &materials);
    
    // Методы для работы с настройками
    void setPropertyNames(const QStringList &propertyNames);
    QStringList availableProperties() const;
    
    // Методы для сохранения/загрузки
    QByteArray saveToDatabase() const;
    void loadFromDatabase(const QByteArray &data);
    
    // Методы для экспорта
    QString getDocumentTitle() const;
    QString getDocumentType() const;
    
    // Методы для проверки статуса строки
    bool isRowHeader(int row) const;
    
    // Метод для установки поджима ячейки
    bool setCellStretch(int row, int column, int stretch);
    
    // Метод для установки флага заголовка ячейки
    bool setCellHeader(int row, int column, bool isHeader);
    
    // Метод для установки флага подчеркивания ячейки
    bool setCellUnderline(int row, int column, bool isUnderline);
    
    // Метод для проверки переполнения ячейки (для подсветки в UI)
    bool isCellOverflow(int row, int column, qreal columnWidth, int fontSize = 12) const;
    
    // Метод для пометки ячейки как переполненной (вызывается из PDFController)
    void setCellOverflow(int row, int column, bool overflow);
    
    // Метод для очистки всех пометок о переполнении
    void clearOverflowMarks();
    
    // Новые методы для работы с разрывами страницами
    void updatePageNumbers();
    void updateRowNumbers();
    int getPageForRow(int rowNumber) const;
    bool needsPageBreakProtection(int rowIndex) const;
    void addPageBreakProtection();
    void optimizePageBreaks();
    
    // Метод для обновления отображения страниц в UI
    void updatePageDisplay();
    
signals:
    void columnMappingsChanged();
    void modelDataChanged();
    
private:
    void updateRowEmptyStatus(int row);
    SpecificationCellData createCellData(const QString &value, bool isHeader = false, 
                                       bool isAuto = false, bool isEmpty = false);
    
    QList<SpecificationRowData> m_rows;
    QStringList m_columnMappings;  // Маппинг колонок на свойства материалов
    QStringList m_propertyNames;   // Доступные свойства материалов
    QList<PCBMaterialModel*> m_materials;  // Материалы для генерации
    QSet<QPair<int, int>> m_overflowCells;  // Множество переполненных ячеек (row, column)
    
    static const int COLUMN_COUNT = 7;
    static const QStringList DEFAULT_HEADERS;
};

#endif // SPECIFICATIONTABLEMODEL_H 