<?php

namespace App\Libs\Backoffice\Fields;

use App\Helpers\Backoffice\LanguageHelper;
use App\Facades\Backoffice\ContentTypes;
use App\Libs\Backoffice\Contracts\SavableField;
use Illuminate\Database\Eloquent\Model;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;

class LinkField extends BaseField implements SavableField
{

    protected $required = false;
    protected $objectTypes = [];
    protected $maxLabel = 0;

    public function __construct($config)
    {
        unset($config["validation"]);
        unset($config["preValidation"]);
        unset($config["inList"]);
        unset($config["search"]);
        unset($config["sort"]);

        parent::__construct($config);

        if (!empty($config["required"])) {
            $this->required = $config["required"];
        }

        if (!empty($config["maxLabel"])) {
            $this->maxLabel = $config["maxLabel"];
        }

        if (!empty($config["objectTypes"])) {
            $this->setObjectTypes($config["objectTypes"]);
        }
    }

    public function isRequired()
    {
        return $this->required;
    }

    public function setRequired($required)
    {
        $this->required = $required;
    }

    public function getData(Model $model, $enabled = true, $hidden = false)
    {
        $fieldName = $this->getName();

        $emptyStructure = [
            'label' => '',
            'isExternal' => false,
            'url' => '',
            'selectedObjectId' => null,
            'newTab' => false
        ];

        $value = $emptyStructure;
        if ($this->isMultiLanguage()) {
            $locales = LaravelLocalization::getSupportedLocales();
            $value = [];
            foreach ($locales as $locale => $localeData) {
                if ($model->exists) {
                    $languageModel = $model->languages->findByLocale($locale);

                    if (!empty($languageModel)) {
                        $field = $languageModel->$fieldName;
                    }

                    $value[$locale] = [
                        'label' => $field['label'] ?? '',
                        'isExternal' => $field['isExternal'] ?? false,
                        'url' => isset($field['isExternal']) && $field['isExternal'] ? $field['url'] : null,
                        'selectedObjectId' => isset($field['isExternal']) && !$field['isExternal'] ? $field['selectedObjectId'] : null,
                        'newTab' => $field['newTab'] ?? false
                    ];
                } else {
                    $value[$locale] = $emptyStructure;
                }
            }
        } else {
            if ($model->exists) {
                $field = $model->$fieldName;

                $value = [
                    'label' => $field['label'] ?? '',
                    'isExternal' => $field['isExternal'] ?? false,
                    'url' => isset($field['isExternal']) && $field['isExternal'] ? $field['url'] : null,
                    'selectedObjectId' => isset($field['isExternal']) && !$field['isExternal'] ? $field['selectedObjectId'] : null,
                    'newTab' => $field['newTab'] ?? false,
                ];
            }
        }

        return [
            'name' => $this->getName(),
            'type' => ucfirst($this->getType()),
            'isMultilanguage' => $this->isMultiLanguage(),
            'label' => $this->getLabel(),
            'info' => $this->getInfo(),
            'value' => $value,
            'hide' => $hidden,
            'enabled' => $enabled,
            'maxLength' => $this->maxLabel,
            'required' => $this->isRequired(),
            'conditions' => $this->conditions,
        ];
    }

    public function save(Model $model, $values)
    {
        $isExternal = isset($values['isExternal']) && $values['isExternal'] == 'true' ? true : false;
        $newTab = isset($values['newTab']) && $values['newTab'] == 'true' ? true : false;

        $fieldStructure = [
            'label' => $values['label'],
            'isExternal' => $isExternal,
            'newTab' => $newTab,
            'url' => $isExternal ? $values['url'] : null,
            'selectedObjectId' => !$isExternal ? $values['selectedObjectId'] : null
        ];
        $fieldName = $this->getName();
        $model->$fieldName = $fieldStructure;
    }

    public function getValidation($subField = null)
    {
        $rules = "";
        if ($this->isRequired()) {
            $rules = "required|";
        } else {
            $rules = "nullable|";
        }
        switch ($subField) {
            case 'label':
                if ($this->maxLabel > 0) {
                    $rules .= "max:{$this->maxLabel}";
                }
                break;
            case 'url':
                $rules .= "url";
                break;
            case 'selectedObjectId':
                $rules .= "integer";
                break;
        }

        return $rules;
    }

    public function getValidationDataRules($model = null, $prefix = '')
    {
        $validation = [
            "rules" => [],
            "labels" => []
        ];

        $fieldName = $this->getName();

        if ($this->isMultiLanguage()) {
            $locales = LaravelLocalization::getSupportedLanguagesKeys();

            $labelRules = LanguageHelper::generateLangRules(
                [$fieldName => $this->getValidation('label')],
                $locales,
                'label'
            );

            $urlRules = [];

            $urlRules[$fieldName.'.*.url'] = $this->getValidation('url');
            $urlRules[$fieldName.'.*.selectedObjectId'] = $this->getValidation('selectedObjectId');

            $validation["rules"] = array_merge($labelRules, $urlRules);

            $labelLabel = LanguageHelper::generateLangLabels(
                $fieldName, trans('backend.link_label'), $locales, 'label');
            $urlLabel = LanguageHelper::generateLangLabels(
                $fieldName, trans('backend.link_url'), $locales, 'url');
            $isExternalLabel = LanguageHelper::generateLangLabels(
                $fieldName, trans('backend.link_object'), $locales, 'selectedObjectId');
            $validation["labels"] = array_merge($labelLabel, $urlLabel, $isExternalLabel);
        } else {
            $validation["rules"][$fieldName.'.label'] = $this->getValidation('label');
            $validation["rules"][$fieldName.'.url'] = $this->getValidation('url');
            $validation["rules"][$fieldName.'.selectedObjectId'] = $this->getValidation('selectedObjectId');

            $validation["labels"][$fieldName.'.label'] = trans('backend.link_label');
            $validation["labels"][$fieldName.'.url'] = trans('backend.link_url');
            $validation["labels"][$fieldName.'.selectedObjectId'] = trans('backend.link_object');
        }

        return $validation;
    }

    public function getValidationDataValues($copyAllLang = false, $input = null)
    {
        $fieldValue = parent::getValidationDataValues($copyAllLang, $input);

        if ($this->isMultiLanguage()) {
            $locales = LaravelLocalization::getSupportedLanguagesKeys();
            $defaultLocale = LaravelLocalization::getDefaultLocale();

            if ($copyAllLang) {
                foreach ($locales as $locale) {
                    if ($locale == $defaultLocale) {
                        continue;
                    }

                    if (empty($fieldValue[$locale])) {
                        $fieldValue[$locale] = $fieldValue[$defaultLocale];
                    }
                }
            }
        }

        return $fieldValue;
    }

    /*
    public function getValidationData($copyAllLang = false)
    {
        $validation = [
            "rules" => [],
            "values" => [],
            "labels" => []
        ];

        $fieldName = $this->getName();
        $fieldValue = request()->input($fieldName);

        if ($this->isMultiLanguage()) {
            foreach ($fieldValue as $lang => $langValue) {
                $fieldValue[$lang] = $langValue;
            }
        }

        if ($this->isMultiLanguage()) {
            $locales = LaravelLocalization::getSupportedLanguagesKeys();
            $defaultLocale = config('app.locale');

            if ($copyAllLang) {

                foreach ($locales as $locale) {
                    if ($locale == $defaultLocale) {
                        continue;
                    }

                    if (empty($fieldValue[$locale])) {
                        $fieldValue[$locale] = $fieldValue[$defaultLocale];
                    }
                }
            }

            $labelRules = LanguageHelper::generateLangRules(
                [$fieldName => $this->getValidation('label')],
                $locales,
                'label'
            );

            $urlRules = [];

            foreach ($locales as $locale) {
                if ($fieldValue[$locale]['isExternal'] == true) {
                    $urlRules[$fieldName.'.'.$locale.'.url'] = $this->getValidation('url');
                } else {
                    $urlRules[$fieldName.'.'.$locale.'.selectedObjectId'] = $this->getValidation('selectedObjectId');
                }
            }

            $validation["rules"] = array_merge($labelRules, $urlRules);

            $labelLabel = LanguageHelper::generateLangLabels(
                $fieldName, trans('backend.link_label'), $locales, 'label');
            $urlLabel = LanguageHelper::generateLangLabels(
                $fieldName, trans('backend.link_url'), $locales, 'url');
            $isExternalLabel = LanguageHelper::generateLangLabels(
                $fieldName, trans('backend.link_object'), $locales, 'selectedObjectId');
            $validation["labels"] = array_merge($labelLabel, $urlLabel, $isExternalLabel);
        } else {
            $validation["rules"][$fieldName.'.label'] = $this->getValidation('label');
            if ($fieldValue['isExternal'] == true) {
                $validation["rules"][$fieldName.'.url'] = $this->getValidation('url');
            } else {
                $validation["rules"][$fieldName.'.selectedObjectId'] = $this->getValidation('selectedObjectId');
            }
            $validation["labels"][$fieldName.'.label'] = trans('backend.link_label');
            $validation["labels"][$fieldName.'.url'] = trans('backend.link_url');
            $validation["labels"][$fieldName.'.selectedObjectId'] = trans('backend.link_object');
        }

        $validation["values"][$fieldName] = $fieldValue;

        return $validation;
    }
    */

    public function toArray()
    {
        $array = parent::toArray();
        $array["required"] = $this->required;

        return $array;
    }

    public function setObjectTypes($objectTypes = [])
    {
        $this->objectTypes = $objectTypes;
    }

    public function getObjectTypes()
    {
        return $this->objectTypes;
    }
}


