<?php namespace Eae\Backoffice\Generic;

use Illuminate\Support\Collection;
use Eae\Backoffice\Generic\Fields\BaseField;
use Eae\Support\Contracts\ListableFieldInterface;
use Eae\Support\Contracts\ExternalFieldInterface;

class FieldCollection extends Collection{         
    public function getListableFields(){
        $fields = $this->filter(function($fieldData){
            return $fieldData->isInList() && $fieldData instanceOf ListableFieldInterface;
        })->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 ExternalFieldInterface);
            }else{
                return $fieldData->getPlacement() == $placement && !($fieldData instanceof ExternalFieldInterface);
            }
        })->values();    
        
        return $fields;    
    }
    
    public function getExternalFields($placement = null){
        $fields = $this->filter(function($fieldData) use($placement){
            if(is_null($placement)){
                return $fieldData instanceof ExternalFieldInterface;
            }else{
                return $fieldData->getPlacement() == $placement && $fieldData instanceof ExternalFieldInterface;
            }
        })->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;        
    }
      
}