/***************************************************************************

    source::worx xtree
    Copyright © 2024-2025 c.holzheuer
    christoph.holzheuer@gmail.com

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/


#include <znode_factory.h>
#include <xqchildmodel.h>
#include <xqselectionmodel.h>
#include <xqitemdelegate.h>
#include <xqappdata.h>
#include <xqtreetable.h>
#include <xqitemfactory.h>



//! default konstruktor.

XQChildModel::XQChildModel( QObject *parent )
    : XQViewModel{parent}
{

}



//! Erzeugt eine model-section und fügt den zugehörigen header ein.

void XQChildModel::addSectionEntry( const QString& key, const XQNodePtr& contentEntry )
{
  const XQModelSection& section = _sections.sectionByKey( key );
  if(section.isValid() )
  {
    section.setContentRootNode( contentEntry->parent() );
    int newRow =_sections.lastRow(section);
    XQNodePtr sheetNode = section.sheetRootNode();
    XQItemList list = _itemFactory.makeRow( sheetNode, nullptr );
    insertRow( newRow, list);
  }
}

//! erzegt den sichtbaren inhalt des models aus einem root-datenknoten.

void XQChildModel::addModelData( const XQNodePtr& contentRoot )
{

  // Die Datenbasis als shared_ptr sichern
  _contentRoot = contentRoot;

  // Wir gehen über alle Einträge, die auch unterschiedliche Typen
  // haben können, hier: <Panel>. <Battery> ...
  for (const auto& contentEntry : _contentRoot->children())
  {
    // Das ist hier der Typ des Eintrags: Panel, Battery ...
    QString key = contentEntry->tag_name();

    // 'silent failure' hier der Datenbaum kann auch Knoten enthalten
    // die nicht für uns gedacht sind.
    if (!_sections.hasValidSection(key))
      continue;

    const XQModelSection& section = _sections.sectionByKey( key );
    section.setContentRootNode( contentEntry->parent() );
    int newRow = _sections.lastRow(section);

    XQNodePtr sheetNode = section.sheetRootNode();
    XQItemList list = _itemFactory.makeRow( sheetNode, contentEntry );

    // als Baum?
    //section.headerItem().appendRow( list );

    // _hinter_ der letzen zeile einfügen
    insertRow( newRow+1, list);

    // Es können noch Kind-Knoten mit
    // Detail-Infos vorhanden sein.

    if( contentEntry->has_children())
    {
      // Die Beschreibungen für die optionalen Kinder
      // steck im ersten Knoten des Model-Sheets
      if( !sheetNode->first_child()->has_children() )
        continue;

      _itemFactory.makeChildRow( list.front(), sheetNode->first_child(), contentEntry );

    }

  } // for

}


//! erzeugt ein adhoc-contextmenu, je nachdem welche aktionen gerade möglich sind.

void XQChildModel::initContextMenu()
{
  // __fixme! add a menu title
  _contextMenu->clear();

  const QModelIndex& curIdx = _treeTable->currentIndex();
  _contextMenu->addAction( "icn11Dummy", "Undo",   XQCommand::cmdUndo,   _undoStack->canUndo() );
  _contextMenu->addAction( "icn17Dummy", "Redo",   XQCommand::cmdRedo,   _undoStack->canRedo() );

  // editieren nur wenns kein header ist.
  if ( !xqItemFromIndex(curIdx).isHeaderStyle() )
  {
    bool hasSel = curIdx.isValid() && _treeTable->selectionModel()->hasSelection();
    bool canPaste = _clipBoard.canPaste( curIdx );

    _contextMenu->addAction( "icn58Dummy", "Cut",    XQCommand::cmdCut,    hasSel );
    _contextMenu->addAction( "icn61Dummy", "Paste",  XQCommand::cmdPaste, canPaste );
    _contextMenu->addAction( "icn55Dummy", "Copy",   XQCommand::cmdCopy,   hasSel );
    //_contextMenu->addAction( "icn35Dummy", "Move",   XQCommand::cmdMove,   hasSel );
    _contextMenu->addAction( "icn70Dummy", "New",    XQCommand::cmdNew,    hasSel );
    _contextMenu->addAction( "icn50Dummy", "Delete", XQCommand::cmdDelete, hasSel );
  }
  // __fixme! set 'toggle section <name>' entry
  //contextMenu.actions().first()->setText("<name>");
  _contextMenu->addAction( "icn29Dummy", "Hide Section", XQCommand::cmdToggleSection, true );
}



