#include "pcbmaterialmodel.h"
#include <QDebug>

PCBMaterialModel::PCBMaterialModel(QObject *parent)
    : QAbstractTableModel(parent)
    , m_database(nullptr)
    , m_layerCount(0)
{
    qDebug() << "PCBMaterialModel: Модель материалов платы создана";
}

int PCBMaterialModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)
    return m_materials.size();
}

int PCBMaterialModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)
    return ColumnCount;
}

QVariant PCBMaterialModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || index.row() >= m_materials.size()) {
        return QVariant();
    }
    
    const PCBMaterialData &material = m_materials[index.row()];
    
    if (role == Qt::DisplayRole) {
        switch (index.column()) {
        case ColumnLayerNumber:
            return material.layerNumber;
        case ColumnName:
            return material.name;
        case ColumnValue:
            return material.value;
        case ColumnHeight:
            return formatHeight(material.height);
        case ColumnDielType:
            return formatDielType(material.dielType);
        default:
            return QVariant();
        }
    }
    
    if (role == Qt::TextAlignmentRole) {
        switch (index.column()) {
        case ColumnLayerNumber:
        case ColumnHeight:
        case ColumnDielType:
            return Qt::AlignCenter;
        default:
            return Qt::AlignLeft;
        }
    }
    
    return QVariant();
}

QVariant PCBMaterialModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole) {
        return QVariant();
    }
    
    if (orientation == Qt::Horizontal) {
        switch (section) {
        case ColumnLayerNumber:
            return tr("№ Слоя");
        case ColumnName:
            return tr("Название");
        case ColumnValue:
            return tr("Значение");
        case ColumnHeight:
            return tr("Толщина (мм)");
        case ColumnDielType:
            return tr("Тип");
        default:
            return QVariant();
        }
    }
    
    return QVariant();
}

void PCBMaterialModel::setDatabase(DataBaseController *database)
{
    m_database = database;
    qDebug() << "PCBMaterialModel: База данных установлена:" << (m_database ? "да" : "нет");
}

void PCBMaterialModel::loadMaterials()
{
    if (!m_database) {
        qDebug() << "PCBMaterialModel: ОШИБКА: База данных не установлена!";
        return;
    }
    
    qDebug() << "PCBMaterialModel: Загружаем материалы платы из БД...";
    
    beginResetModel();
    
    // Очищаем текущие данные
    m_materials.clear();
    m_layerCount = 0;
    
    // Получаем данные PCB
    PCBData pcbData = m_database->getPCBData();
    m_layerCount = pcbData.layerCount;
    
    qDebug() << "PCBMaterialModel: Количество слоев из БД:" << m_layerCount;
    
    // Получаем материалы
    QList<DielProperty> dielMaterials = m_database->getDielMaterials();
    
    qDebug() << "PCBMaterialModel: Количество материалов из БД:" << dielMaterials.size();
    
    // Конвертируем DielProperty в PCBMaterialData
    for (const DielProperty &diel : dielMaterials) {
        PCBMaterialData material(
            -1, // ID будет установлен позже, если нужно
            diel.name,
            diel.value,
            diel.height,
            diel.dielType,
            diel.layerNumber
        );
        
        m_materials.append(material);
        
        qDebug() << "PCBMaterialModel: Добавлен материал:" << material.name 
                 << "=" << material.value << "слой:" << material.layerNumber 
                 << "толщина:" << material.height << "мм";
    }
    
    endResetModel();
    
    qDebug() << "PCBMaterialModel: Загрузка завершена. Материалов:" << m_materials.size() 
             << "слоев:" << m_layerCount;
}

void PCBMaterialModel::clearMaterials()
{
    qDebug() << "PCBMaterialModel: Очищаем материалы";
    
    beginResetModel();
    m_materials.clear();
    m_layerCount = 0;
    endResetModel();
}

PCBMaterialData PCBMaterialModel::getMaterial(int row) const
{
    if (row >= 0 && row < m_materials.size()) {
        return m_materials[row];
    }
    return PCBMaterialData();
}

QString PCBMaterialModel::getMaterialName(int row) const
{
    if (row >= 0 && row < m_materials.size()) {
        return m_materials[row].name;
    }
    return QString();
}

QString PCBMaterialModel::getMaterialValue(int row) const
{
    if (row >= 0 && row < m_materials.size()) {
        return m_materials[row].value;
    }
    return QString();
}

double PCBMaterialModel::getMaterialHeight(int row) const
{
    if (row >= 0 && row < m_materials.size()) {
        return m_materials[row].height;
    }
    return 0.0;
}

int PCBMaterialModel::getMaterialDielType(int row) const
{
    if (row >= 0 && row < m_materials.size()) {
        return m_materials[row].dielType;
    }
    return 0;
}

int PCBMaterialModel::getMaterialLayerNumber(int row) const
{
    if (row >= 0 && row < m_materials.size()) {
        return m_materials[row].layerNumber;
    }
    return 0;
}

QString PCBMaterialModel::formatHeight(double height) const
{
    return QString::number(height, 'f', 3);
}

QString PCBMaterialModel::formatDielType(int dielType) const
{
    switch (dielType) {
    case 1:
        return tr("Ядро");
    case 2:
        return tr("Препрег");
    default:
        return tr("Неизвестно");
    }
} 