<?php

namespace Webkul\WebkulCsvBundle\Connector\Writer\File;

use Webkul\WebkulCsvBundle\Services\WebkulCsvConnector;

/**
 * Reorder columns before export
 */
class ProductColumnSorter extends \DefaultColumnSorter implements \ColumnSorterInterface
{
    /** @var  \AttributeRepositoryInterface */
    protected $attributeRepository;

    /** @var \AssociationTypeRepositoryInterface */
    protected $associationTypeRepository;

    /** @var ConnectorService */
    protected $connectorService;

    /**
     * @param \FieldSplitter                         $fieldSplitter
     * @param \AttributeRepositoryInterface          $attributeRepository
     * @param \AssociationTypeRepositoryInterface    $associationTypeRepository
     * @param array                                  $firstDefaultColumns
     * @param WebkulCsvConnector                     $attributeRepository
     */
    public function __construct(
        \FieldSplitter $fieldSplitter,
        \AttributeRepositoryInterface $attributeRepository,
        \AssociationTypeRepositoryInterface $associationTypeRepository,
        array $firstDefaultColumns,
        WebkulCsvConnector $connectorService
    ) {
        parent::__construct($fieldSplitter, $firstDefaultColumns);

        $this->attributeRepository       = $attributeRepository;
        $this->associationTypeRepository = $associationTypeRepository;
        $this->connectorService = $connectorService;
    }

    /**
     * {@inheritdoc}
     */
    public function sort(array $columns, array $context = [])
    {
        $identifier = $this->attributeRepository->getIdentifierCode();
        $extraMapping = $this->connectorService->getExtraMappingByMappingType('xlsxExportMapping');
        $familyField = isset($extraMapping['familyFieldName']) ? $extraMapping['familyFieldName'] : '';
        if (isset($context['filters']['structure']['attributes']) &&
            !empty($context['filters']['structure']['attributes'])
        ) {
            $rawColumns = array_merge(
                [$identifier],
                $this->firstDefaultColumns,
                array_map(function ($associationType) {
                    return $associationType->getCode();
                }, $this->associationTypeRepository->findAll()),
                $context['filters']['structure']['attributes']
            );

            $sortedColumns = [];
            foreach ($rawColumns as $columnCode) {
                $sortedColumns = array_merge($sortedColumns, array_filter($columns, function ($columnCandidate) use ($columnCode) {
                    return 0 !== preg_match(sprintf('/^%s(-.*)*$/', $columnCode), $columnCandidate);
                }));
            }

            return array_unique($sortedColumns);
        }

        array_unshift($this->firstDefaultColumns, $identifier);

        $mainColumns = [];
        $additionalColumns = [];
        foreach ($columns as $column) {
            if ($this->isInOrderConf($column)) {
                $mainColumns[] = $column;
            } elseif ($familyField && strpos($column, $familyField) !== false) {
                $mainColumns[] = $column;
            } else {
                $additionalColumns[] = $column;
            }
        }

        // usort($mainColumns, [$this, 'compare']);
        // natcasesort($additionalColumns);

        return array_merge($mainColumns, array_reverse($additionalColumns));
    }
}
