#ifndef CSVEXPORTER_H
#define CSVEXPORTER_H

#include <QObject>
#include <QString>
#include <QAbstractTableModel>

class SpecificationPCBTableModel;
class SpecificationTableModel;
class PerechenTableModel;
class VedomostTableModel;
class SimpleListTableModel;

/**
 * @brief Класс для экспорта таблиц в формат CSV
 * 
 * Поддерживает экспорт следующих типов таблиц:
 * - SpecificationPCBTableModel (Спецификация PCB)
 * - SpecificationTableModel (Спецификация материалов)
 * - PerechenTableModel (Перечень элементов)
 * - VedomostTableModel (Ведомость покупных изделий)
 */
class CSVExporter : public QObject
{
    Q_OBJECT

public:
    explicit CSVExporter(QObject *parent = nullptr);
    
    /**
     * @brief Экспортирует таблицу спецификации PCB в CSV
     * @param filePath Путь к файлу для сохранения
     * @param model Модель таблицы спецификации PCB
     * @return true если экспорт успешен, false в противном случае
     */
    bool exportSpecificationPCB(const QString &filePath, SpecificationPCBTableModel *model);
    
    /**
     * @brief Экспортирует таблицу спецификации материалов в CSV
     * @param filePath Путь к файлу для сохранения
     * @param model Модель таблицы спецификации материалов
     * @return true если экспорт успешен, false в противном случае
     */
    bool exportSpecification(const QString &filePath, SpecificationTableModel *model);
    
    /**
     * @brief Экспортирует таблицу перечня элементов в CSV
     * @param filePath Путь к файлу для сохранения
     * @param model Модель таблицы перечня элементов
     * @return true если экспорт успешен, false в противном случае
     */
    bool exportPerechen(const QString &filePath, PerechenTableModel *model);
    
    /**
     * @brief Экспортирует таблицу ведомости покупных изделий в CSV
     * @param filePath Путь к файлу для сохранения
     * @param model Модель таблицы ведомости покупных изделий
     * @return true если экспорт успешен, false в противном случае
     */
    bool exportVedomost(const QString &filePath, VedomostTableModel *model);
    
    /**
     * @brief Экспортирует таблицу бланка заказа в CSV
     * @param filePath Путь к файлу для сохранения
     * @param model Модель таблицы бланка заказа
     * @return true если экспорт успешен, false в противном случае
     */
    bool exportSimpleList(const QString &filePath, SimpleListTableModel *model);
    
    /**
     * @brief Экспортирует любую модель таблицы в CSV
     * @param filePath Путь к файлу для сохранения
     * @param model Модель таблицы
     * @param includeHeaders Включать ли заголовки колонок
     * @return true если экспорт успешен, false в противном случае
     */
    bool exportTableModel(const QString &filePath, QAbstractTableModel *model, bool includeHeaders = true);
    
    /**
     * @brief Возвращает последнюю ошибку
     * @return Текст ошибки
     */
    QString lastError() const;

private:
    /**
     * @brief Экранирует значение для CSV
     * @param value Значение для экранирования
     * @return Экранированное значение
     */
    QString escapeCsvValue(const QString &value) const;
    
    /**
     * @brief Формирует строку CSV из списка значений
     * @param values Список значений
     * @return Строка CSV
     */
    QString formatCsvRow(const QStringList &values) const;
    
    QString m_lastError;
};

#endif // CSVEXPORTER_H

