#ifndef PDFCONTROLLER_H
#define PDFCONTROLLER_H

#include <QObject>
#include <QPainter>
#include <QString>
#include <QFont>
#include <QList>
#include <QModelIndex>
#include "../model/pageinfo.h"
#include "../model/perechentablemodel.h"

class MainController;
class PerechenTableModel;
class TitleInscriptionsModel;
class ProjectParamTableModel;
class SpecificationPCBTableModel;
class SpecificationTableModel;
class VedomostTableModel;

class PDFController : public QObject
{
    Q_OBJECT
public:
    explicit PDFController(QObject *parent = nullptr);

    // Метод для экспорта перечня элементов в PDF
    bool exportPerechenToPdf(const QString &filePath, MainController *mainController);

    // Метод для экспорта спецификации PCB в PDF
    bool exportSpecificationPcbToPdf(const QString &filePath, MainController *mainController);

    // Метод для экспорта спецификации материалов в PDF
    bool exportSpecificationToPdf(const QString &filePath, MainController *mainController);

    // Метод для экспорта ведомости покупных изделий в PDF
    bool exportVedomostToPdf(const QString &filePath, MainController *mainController);

    // Новые методы для предварительного просмотра
    QList<PageInfo> getPerechenPagesInfo(MainController *mainController);
    QList<PageInfo> getSpecificationPcbPagesInfo(MainController *mainController);
    QList<PageInfo> getSpecificationPagesInfo(MainController *mainController);
    QList<PageInfo> getVedomostPagesInfo(MainController *mainController);
    
    // Методы для рисования страниц на painter
    bool drawPerechenPage(QPainter &painter, const PageInfo &pageInfo, MainController *mainController);
    bool drawSpecificationPcbPage(QPainter &painter, const PageInfo &pageInfo, MainController *mainController);
    bool drawSpecificationPage(QPainter &painter, const PageInfo &pageInfo, MainController *mainController);
    bool drawVedomostPage(QPainter &painter, const PageInfo &pageInfo, MainController *mainController);

    // Методы для генерации таблиц
    bool generateTableA4(const QString &filePath, MainController *mainController);
    bool generateTableA5(const QString &filePath, MainController *mainController);
    
    // Методы для генерации штампов ГОСТ
    bool generateGostStampA4(const QString &filePath, MainController *mainController);

    bool generateGostStampA5(const QString &filePath, MainController *mainController);

    // Утилитарные функции для работы с шрифтом ГОСТ
    static QFont createGostFont(int pointSize, bool bold = false, bool italic = false, int stretch = 100);
    static void drawTextWithGostFont(QPainter &painter, const QRectF &rect, 
                                   const QString &text, int pointSize, 
                                   Qt::Alignment alignment = Qt::AlignLeft);
    static void drawTextWithAutoSize(QPainter &painter, const QRectF &rect, 
                                   const QString &text, int maxPointSize = 20);
    static void drawTextMultiline(QPainter &painter, const QRectF &rect, 
                                 const QString &text, const QFont &font, 
                                 int maxLines = 3);

    // Метод для получения значения надписи с учетом параметров проекта
    static QString getInscriptionValueWithProjectParams(const TitleInscriptionsModel* titleModel, 
                                                       const ProjectParamTableModel* projectParamModel,
                                                       int inscriptionIndex);

private:
    // Вспомогательные методы для создания PDF
    bool createPdfDocument(const QString &filePath, const QString &title);
    bool addGostFrameA4FirstPage(QPainter &painter, const QRectF &pageRect, const TitleInscriptionsModel* model, const ProjectParamTableModel* projectParamModel, int currentPage, int totalPages , int docType);
    bool addGostFrameA4(QPainter &painter, const QRectF &pageRect, const TitleInscriptionsModel* model, const ProjectParamTableModel* projectParamModel, int currentPage, int totalPages, int docType);
    bool addGostFrameA3(QPainter &painter, const QRectF &pageRect, const TitleInscriptionsModel* model, const ProjectParamTableModel* projectParamModel, int currentPage, int totalPages);
    bool addTitleInscriptions(QPainter &painter, TitleInscriptionsModel *titleModel, const QRectF &stampRect);
    bool addPerechenTable(QPainter &painter, PerechenTableModel *perechenModel, const QRectF &tableRect, MainController *mainController = nullptr);
    bool addPerechenTableRange(QPainter &painter, PerechenTableModel *perechenModel, const QRectF &tableRect, int startRow, int rowCount, MainController *mainController = nullptr);
    bool addSpecificationPcbTableRange(QPainter &painter, SpecificationPCBTableModel *specificationModel, const QRectF &tableRect, int startRow, int rowCount, MainController *mainController = nullptr);
    bool addSpecificationTableRange(QPainter &painter, SpecificationTableModel *specificationModel, const QRectF &tableRect, int startRow, int rowCount, MainController *mainController = nullptr);
    bool addVedomostTableRange(QPainter &painter, VedomostTableModel *vedomostModel, const QRectF &tableRect, int startRow, int rowCount, MainController *mainController = nullptr);

    bool addGostFrameA3FirstPage(QPainter &painter, const QRectF &pageRect, const TitleInscriptionsModel *model, const ProjectParamTableModel *projectParamModel, int currentPage, int totalPages);
    bool addListRegistrationTable(QPainter &painter,const QRectF &pageRect);
    
    // Вспомогательная функция для получения поджима ячейки
    static int getCellStretch(const QModelIndex &index, int defaultStretch);
    
    // Вспомогательная функция для получения флага подчеркивания ячейки
    static bool getCellUnderline(const QModelIndex &index, bool defaultUnderline = true);
    
    // Вспомогательная функция для рисования ячейки с учетом поджима
    void drawCellWithStretch(QPainter &painter, const QModelIndex &index, const QRectF &rect, 
                             const QString &text, int fontSize, int defaultStretch, 
                             const QFont &baseFont, Qt::Alignment alignment, MainController *mainController = nullptr);
signals:
    // Сигнал о переполнении ячейки при отрисовке в PDF
    void cellOverflowDetected(const QModelIndex &index, bool isOverflow);
};

#endif // PDFCONTROLLER_H
