<?php

namespace Drupal\edlp_migrate\Plugin\migrate\source;

use Drupal\migrate\Row;
use Drupal\node\Plugin\migrate\source\d6\Node as D6Node;

/**
 * Source plugin for edlp corpus migration.
 *
 * @MigrateSource(
 *   id = "d6_edlp_sons"
 * )
 */
class D6EdlpSons extends D6Node {


  /**
   * {@inheritdoc}
   */
  public function query() {
    $query = $this->select('node_revisions', 'nr');
    $query->innerJoin('node', 'n', static::JOIN);
    $this->handleTranslations($query);

    $query->fields('n', [
        'nid',
        'type',
        'language',
        'status',
        'created',
        'changed',
        'comment',
        'promote',
        'moderate',
        'sticky',
        'tnid',
        'translate',
      ])
      ->fields('nr', [
        'title',
        'body',
        'teaser',
        'log',
        'timestamp',
        'format',
        'vid',
      ]);
    $query->addField('n', 'uid', 'node_uid');
    $query->addField('nr', 'uid', 'revision_uid');

    // If the content_translation module is enabled, get the source langcode
    // to fill the content_translation_source field.
    if ($this->moduleHandler->moduleExists('content_translation')) {
      $query->leftJoin('node', 'nt', 'n.tnid = nt.nid');
      $query->addField('nt', 'language', 'source_langcode');
    }

    if (isset($this->configuration['node_type'])) {
      $query->condition('n.type', $this->configuration['node_type']);
    }

    return $query;
  }


  /**
   * {@inheritdoc}
   */
  public function fields() {

    $fields = [
      'nid' => $this->t('Node ID'),
      'type' => $this->t('Type'),
      'title' => $this->t('Title'),
      'body' => $this->t('Body'),
      'format' => $this->t('Format'),
      'teaser' => $this->t('Teaser'),
      'node_uid' => $this->t('Node authored by (uid)'),
      'revision_uid' => $this->t('Revision authored by (uid)'),
      'created' => $this->t('Created timestamp'),
      'changed' => $this->t('Modified timestamp'),
      'status' => $this->t('Published'),
      'promote' => $this->t('Promoted to front page'),
      'sticky' => $this->t('Sticky at top of lists'),
      'revision' => $this->t('Create new revision'),
      'language' => $this->t('Language (fr, en, ...)'),
      'tnid' => $this->t('The translation set id for this node'),
      'timestamp' => $this->t('The timestamp the latest revision of this node was created.'),
    ];
    return $fields;
  }

  /**
   * {@inheritdoc}
   */
  public function prepareRow(Row $row) {
    drush_print(' ');
    drush_print('- - - - - - - - - - - - - - - - - - - - - - - -');
    drush_print($row->getSourceProperty('title'));


    // format = 0 can happen when the body field is hidden. Set the format to 1
    // to avoid migration map issues (since the body field isn't used anyway).
    if ($row->getSourceProperty('format') === '0') {
      $row->setSourceProperty('format', $this->filterDefaultFormat);
    }

    if ($this->moduleExists('content') && $this->getModuleSchemaVersion('content') >= 6001) {
      foreach ($this->getFieldValues($row) as $field => $values) {
        $row->setSourceProperty($field, $values);
      }
    }
    $row_nid = $row->getSourceProperty('nid');


    // Make sure we always have a translation set.
    if ($row->getSourceProperty('tnid') == 0) {
      $row->setSourceProperty('tnid', $row_nid);
    }

    // Genres
    $genres = [];
    foreach ($row->getSourceProperty('field_genre') as $key => $value) {
      $genres[] = array($value['value']);
    }
    $row->setSourceProperty('genres', $genres);

    // locuteurs
    $locuteurs = [];
    foreach ($row->getSourceProperty('field_artiste') as $key => $value) {
      $term_name = $value['value'];
      // check if term already exists in configured vocabulary
      $term = array_shift(taxonomy_term_load_multiple_by_name($term_name, 'locuteurs'));
      if(!$term){
        // if not create the term and get the tid
        $term = \Drupal\taxonomy\Entity\Term::create([
              'vid' => 'locuteurs',
              'name' => $term_name,
            ]);
        $term->save();
      }
      // record the tid in array
      $locuteurs[] = $term->get('tid')->value;
    }
    $row->setSourceProperty('locuteurs', $locuteurs);

    // collectionneurs
    $collectionneurs = [];
    foreach ($row->getSourceProperty('field_compositeur') as $key => $value) {
      $term_name = $value['value'];
      // check if term already exists in configured vocabulary
      $term = array_shift(taxonomy_term_load_multiple_by_name($term_name, 'collectionneurs'));
      if(!$term){
        // if not create the term and get the tid
        $term = \Drupal\taxonomy\Entity\Term::create([
              'vid' => 'collectionneurs',
              'name' => $term_name,
            ]);
        $term->save();
      }
      // record the tid in array
      $collectionneurs[] = $term->get('tid')->value;
    }
    $row->setSourceProperty('collectionneurs', $collectionneurs);

    // son
    // drush_print('field_mp3 : ', 0, null, false);
    // drush_print_r($row->getSourceProperty('field_mp3'));
    $sons = [];
    foreach ($row->getSourceProperty('field_mp3') as $key => $value) {
      $sons[] = array($value['fid']);
    }
    $row->setSourceProperty('sons_fid', $sons);

    // get the workflow state (will be converted on status)
    $query = $this->select('workflow_node', 'wn');
    $query->fields('wn', ['sid']);
    $query->condition('wn.nid', $row_nid);
    $results = $query->execute()->fetchField();

    // drush_print('workflow query results : ', 0, null, false);
    // drush_print_r($results);

    $row->setSourceProperty('workflow', $results);


    $row = parent::prepareRow($row);
    return $row;
  }


}
