<?php

namespace App\Libs\Backoffice\Generic;

use App\Libs\Backoffice\Generic\Fields\BaseField;
use App\Libs\Contracts\Backoffice\ExternalField;
use App\Libs\Contracts\Backoffice\ListableField;
use Illuminate\Support\Collection;

class FieldCollection extends Collection
{
    public function getListableFields()
    {
        $fields = $this->filter(function ($fieldData) {
            return $fieldData->isInList() && $fieldData instanceOf ListableField;
        })->values();

        return $fields;
    }

    public function getMultiLanguageFields()
    {
        $fields = $this->filter(function (BaseField $fieldData) {
            return $fieldData->isMultiLanguage();
        })->values();

        return $fields;
    }

    public function getSingleLanguageFields()
    {
        $fields = $this->filter(function (BaseField $fieldData) {
            return !$fieldData->isMultiLanguage();
        })->values();

        return $fields;
    }

    public function getRelationFields()
    {
        $fields = $this->filter(function (BaseField $fieldData) {
            return $fieldData->isRelationField();
        })->values();

        return $fields;
    }

    public function getFieldsByPlacement($placement = "main")
    {
        $fields = $this->filter(function (BaseField $fieldData) use ($placement) {
            return $fieldData->getPlacement() == $placement;
        })->values();

        return $fields;
    }

    public function getMainFormFields($placement = null)
    {
        $fields = $this->filter(function ($fieldData) use ($placement) {
            if (is_null($placement)) {
                return !($fieldData instanceof ExternalField);
            } else {
                return $fieldData->getPlacement() == $placement && !($fieldData instanceof ExternalField);
            }
        })->values();

        return $fields;
    }

    public function getExternalFields($placement = null)
    {
        $fields = $this->filter(function ($fieldData) use ($placement) {
            if (is_null($placement)) {
                return $fieldData instanceof ExternalField;
            } else {
                return $fieldData->getPlacement() == $placement && $fieldData instanceof ExternalField;
            }
        })->values();

        return $fields;
    }

    public function getSearchableFields()
    {
        $fields = $this->filter(function (BaseField $fieldData) {
            return $fieldData->isSearchable();
        })->values();

        return $fields;
    }

    public function getFieldsByNames($names)
    {
        $fields = $this->filter(function (BaseField $fieldData) use ($names) {
            return in_array($fieldData->getName(), $names);
        })->values();

        return $fields;
    }

    public function find($name)
    {
        $fields = $this->filter(function (BaseField $fieldData) use ($name) {
            return $fieldData->getName() == $name;
        })->first();

        return $fields;
    }

}