<?php

declare(strict_types=1);

namespace Xentral\Components\SchemaCreator\Collection;

use ArrayIterator;
use IteratorAggregate;
use Xentral\Components\SchemaCreator\Exception\SchemaCreatorInvalidArgumentException;
use Xentral\Components\SchemaCreator\Interfaces\ColumnInterface;

final class ColumnCollection implements IteratorAggregate
{

    /** @var array|ColumnInterface[] */
    private $values = [];

    /** @var null|ColumnInterface */
    private $autoIncrementColumn;

    /**
     * @param array $values
     */
    public function __construct(array $values = [])
    {
        foreach ($values as $value) {
            $this->add($value);
        }
    }

    /**
     * @param ColumnInterface $field
     *
     * @return void
     */
    public function add(ColumnInterface $field): void
    {
        if ($this->hasColumn($field->getField()) === true) {
            throw new SchemaCreatorInvalidArgumentException(
                sprintf('Column name `%s` already added', $field->getField())
            );
        }

        $options = $field->getOptions();
        if (array_key_exists('extra', $options) && $options['extra'] !== null) {

             if ($options['extra'] === 'AUTO_INCREMENT' || $options['extra'] === 'ai') {
                 $this->autoIncrementColumn = $field;
             }
        }

        $this->values[] = $field;
    }

    /**
     * @param string $column
     *
     * @return bool
     */
    public function hasColumn(string $column): bool
    {
        /** @var  ColumnInterface $configuredColumns */
        foreach ($this->values as $configuredColumns) {
            if ($column === $configuredColumns->getField()) {
                return true;
            }
        }

        return false;
    }

    /**
     * @return array|string[]
     */
    public function getFields(): array
    {
        $fields = [];
        foreach ($this->values as $column) {
            $fields[] = $column->getField();
        }

        return $fields;
    }

    /**
     * @return ArrayIterator|ColumnInterface[]
     */
    public function getIterator()
    {
        return new ArrayIterator($this->values);
    }

    /***
     * @return bool
     */
    public function hasAutoIncrement(): bool
    {
        return null !== $this->autoIncrementColumn;
    }

    /**
     * @return ColumnInterface|null
     */
    public function getAutoIncrementColumn(): ?ColumnInterface
    {
        return $this->autoIncrementColumn;
    }


}