<?php

namespace App\Libs\Backoffice\Fields;

use App\Libs\Backoffice\Contracts\ListableField;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;

class CheckBoxField extends BaseField implements ListableField
{

    public function __construct($config)
    {
        unset($config["search"]);
        parent::__construct($config);
    }

    public function buildSelect(Builder $query)
    {
        if ($this->isMultiLanguage()) {
            $tablePrefix = $query->getModel()->languages()->getRelated()->getTable();
        } else {
            $tablePrefix = $query->getModel()->getTable();
        }

        $query->addSelect("{$tablePrefix}.{$this->name}");
        return $query;
    }

    public function buildWhere(Builder $query, $searchPhrase)
    {
        return $query;
    }

    public function buildOrder(Builder $query, $sortOrder = "asc")
    {
        if ($this->isMultiLanguage()) {
            $tablePrefix = $query->getModel()->languages()->getRelated()->getTable();
        } else {
            $tablePrefix = $query->getModel()->getTable();
        }

        $query->orderBy("{$tablePrefix}.{$this->getName()}", $sortOrder);
        return $query;
    }

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

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

            foreach ($locales as $locale => $localeData) {
                if ($model->exists) {
                    $languageModel = $model->languages->findByLocale($locale);

                    if (!empty($languageModel)) {
                        $value[$locale] = $languageModel->$fieldName;
                    } else {
                        $value[$locale] = '';
                    }
                } else {
                    $value[$locale] = '';
                }
            }
        } else {
            $value = $model->exists ? $model->$fieldName : null;
        }

        $validation = $this->getValidation();

        return [
            'name' => $this->getName(),
            'type' => ucfirst($this->getType()),
            'isMultilanguage' => $this->isMultiLanguage(),
            'label' => $this->getLabel(),
            'info' => $this->getInfo(),
            'value' => (bool) $value,
            'hide' => $hidden,
            'enabled' => $enabled,
            'conditions' => $this->conditions,
            'required' => $validation && str_contains($validation, 'required') ?: false,
        ];
    }

    public function getValidation()
    {
        $validation = parent::getValidation();
        $rule = "boolean";

        if (empty($validation)) {
            return $rule;
        } else {
            return $validation."|".$rule;
        }
    }

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

        $finalValues = null;

        if ($this->isMultiLanguage()) {
            $locales = LaravelLocalization::getSupportedLocales();
            $finalValues = array();
            if (empty($values)) {
                $values = array();
            }

            foreach ($locales as $locale => $localeData) {
                if (isset($values[$locale])) {
                    $finalValues[$locale] = $values[$locale];
                } else {
                    $finalValues[$locale] = false;
                }
            }

            if ($copyAllLang) {
                $defaultLocale = LaravelLocalization::getDefaultLocale();

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

                    if (empty($finalValues[$locale])) {
                        $finalValues[$locale] = $finalValues[$defaultLocale];
                    }
                }
            }
        } else {
            if (empty($values)) {
                $finalValues = false;
            } else {
                $finalValues = $values;
            }
        }

        return $finalValues;
    }

    /*
    public function getValidationData($copyAllLang = false)
    {
        $validation = parent::getValidationData(false);
        $fieldName = $this->getName();
        $values = request()->get($fieldName);
        $finalValues = null;

        if ($this->isMultiLanguage()) {
            $locales = LaravelLocalization::getSupportedLocales();
            $finalValues = array();
            if (empty($values)) {
                $values = array();
            }

            foreach ($locales as $locale => $localeData) {
                if (isset($values[$locale])) {
                    $finalValues[$locale] = $values[$locale];
                } else {
                    $finalValues[$locale] = false;
                }
            }

            if ($copyAllLang) {
                $defaultLocale = LaravelLocalization::getDefaultLocale();

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

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

            $validation["values"][$fieldName] = $finalValues;
        } else {
            if (empty($values)) {
                $validation["values"][$fieldName] = false;
            } else {
                $validation["values"][$fieldName] = $values;
            }
        }

        return $validation;
    }
    */

    public function toArray()
    {
        $array = parent::toArray();
        $array["formatter"] = 'check';

        return $array;
    }

    public function getListData()
    {
        return [
            'name' => $this->getName(),
            'type' => ucfirst($this->getType()),
            'label' => ucfirst($this->getLabel()),
            'isStaticList' => !empty($this->list)
        ];
    }
}
