/home/bdqbpbxa/dev-subdomains/api-uniferx.goodface.com.ua/app/Nova/Product.php
<?php

namespace App\Nova;

use Acme\MultilangLongtext\MultilangLongtext;
use Acme\MultilangText\MultilangText;
use Acme\MultilangTextarea\MultilangTextarea;
use App\Models\Country;
use App\Models\Language;
use App\Nova\Actions\AttachCropToProduct;
use App\Nova\Repeater\Product\Benefits;
use App\Nova\Repeater\Product\CompositionCompatibility;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\FormData;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\Heading;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Image;
use Laravel\Nova\Fields\MorphedByMany;
use Laravel\Nova\Fields\Repeater;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Slug;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\URL;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Query\Builder;
use Oneduo\NovaFileManager\FileManager;
use Whitecube\NovaFlexibleContent\Flexible;

class Product extends Resource
{
    /**
     * The model the resource corresponds to.
     *
     * @var class-string<\App\Models\Product>
     */
    public static string $model = \App\Models\Product::class;

    /**
     * The single value that should be used to represent the resource when being displayed.
     *
     * @var string
     */
    public static $title = 'system_name';

    /**
     * The columns that should be searched.
     *
     * @var array
     */
    public static $search = [
        'system_name',
    ];
    public static $trafficCop = false;

    /**
     * Get the fields displayed by the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function fields(NovaRequest $request)
    {
        $countries = Country::query()->get();
        $languages = Language::query()->get();
        $uploadLink = route('nova.fields.upload.image');

        return [
            ID::make()->sortable()->hide(),
            Boolean::make(__('Visibility'), 'is_enabled'),
            Text::make(__('System name'), 'system_name')->fullWidth()->sortable(),
            Slug::make(__('Slug'), 'slug')->from(__('System name'))->separator('_')
                ->rules('required')
                ->creationRules('unique:products,slug'),
            Select::make(__('Type'), 'type')->options([
                'product' => __('Product'),
                'related_product' => __('Related product'),
            ])->displayUsingLabels()
                ->rules('required')->sortable(),

            BelongsTo::make(__('Product'), 'product')
                ->readonly()
                ->dependsOn('type', function (BelongsTo $field, NovaRequest $request, FormData $formData) {
                    if ($formData->type === 'related_product') {
                        $field->readonly(false);
                    } else {
                        $field->value = null;
                    }
                })->relatableQueryUsing(function (NovaRequest $request, $query) {
                    $product = \App\Models\Product::find($request->resourceId);
                    if ($product) {
                        return $query->where('id', '!=', $product->id);
                    }
                    return $query;
                }),

            /** Preview data */
            Heading::make(__('Preview data')),
            MultilangText::make('Preview title', 'preview_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),

            FileManager::make(__('Preview image'), 'preview_image')->hideFromIndex(),

            FileManager::make(__('Logo'), 'logo')->fullWidth(),
            MultilangLongtext::make('Preview description', 'preview_description')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangText::make('Preview button text', 'preview_button_text')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),

            /** First screen */
            Heading::make(__('First screen')),
            MultilangText::make(__('Title'), 'title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangText::make(__('Title button'), 'title_button')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangText::make(__('Title button link'), 'title_button_link')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            FileManager::make(__('Title image'), 'title_image')->hideFromIndex(),

            /** About */
            Heading::make(__('About')),
//            MultilangText::make('About tag', 'about_tag')->languages($languages)->countries($countries)->uploadLink($uploadLink)
//                ->fullWidth()->hideFromIndex(),
            MultilangTextarea::make('About title', 'about_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangTextarea::make('About description', 'about_description')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),

            /** General information */
            Heading::make(__('General information')),
            MultilangText::make(__('General information title'), 'data->general_information_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangTextarea::make('General information', 'general_information')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangText::make('General information read more', 'general_information_read_more')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangText::make('Formula title', 'data->formula_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangTextarea::make('Formula text', 'data->formula_text')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangTextarea::make('Formula table', 'data->formula_table')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
//            FileManager::make(__('Formula image'), 'general_information_image')->hideFromIndex(),
            MultilangTextarea::make('Formula description', 'data->formula_description')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),

            /** Benefits */
            Heading::make(__('Benefits')),

            MultilangText::make(__('Benefits title'), 'data->benefits_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            Repeater::make('Benefits', 'benefits')
                ->repeatables([
                    Benefits::make(),
                ])
                ->fullWidth()->hideFromIndex(),
            FileManager::make(__('Benefits preview video'), 'benefits_preview_video->preview')->hideFromIndex(),

            MultilangText::make(__('Benefits preview text'), 'benefits_preview_video->text')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangText::make(__('Benefits Video link'), 'benefits_video')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),



            MultilangText::make(__('Products title'), 'data->products_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            MultilangText::make(__('Composition & Compatibility title'), 'data->composition_compatibility_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                ->fullWidth()->hideFromIndex(),
            Flexible::make('Composition & Compatibility', 'composition_compatibility')->addLayout('Country', 'country', [
                MultilangText::make('Title', 'title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
                    ->fullWidth(),
                FileManager::make(__('File'), 'file')->fullWidth()
            ])->fullWidth()->hideFromIndex(),
//            MultilangText::make(__('Nutrition programs title'), 'data->nutrition_programs_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
//                ->fullWidth()->hideFromIndex(),
//            MultilangText::make(__('Trial results title'), 'data->trial_results_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
//                ->fullWidth()->hideFromIndex(),
//            Repeater::make('Composition & Compatibility', 'composition_compatibility')
//                ->repeatables([
//                    CompositionCompatibility::make(),
//                ])
//                ->fullWidth()->hideFromIndex(),


            HasMany::make(__('Related Products'), 'related_products', Product::class)
                ,
            BelongsToMany::make(__('Nutrition Programs Crop'), 'nutrition_programs', Crop::class),
            BelongsToMany::make(__('Trial Results Crop'), 'trial_results', Crop::class),
//            BelongsToMany::make(__('Catalogs'), 'catalogs', Catalog::class),
            MorphedByMany::make(__('Catalogs'), 'Catalogs', Catalog::class),

        ];
    }

    /**
     * Get the cards available for the request.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function cards(NovaRequest $request)
    {
        return [];
    }

    /**
     * Get the filters available for the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function filters(NovaRequest $request)
    {
        return [];
    }

    /**
     * Get the lenses available for the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function lenses(NovaRequest $request)
    {
        return [];
    }

    /**
     * Get the actions available for the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function actions(NovaRequest $request)
    {
        return [
            (new AttachCropToProduct())->onlyOnDetail(),
        ];
    }

    public static function relatableProducts(NovaRequest $request, $query)
    {
        $product = \App\Models\Product::find($request->resourceId);
        if ($product) {
            return $query->where('id', '!=', $product->id)
                ->when($product->type === 'product', function ($query) {
                    $query->where('type', 'related_product');
                });
        }
    }
//    public static function relatableProduct(NovaRequest $request, $query)
//    {
//        $product = \App\Models\Product::find($request->resourceId);
//        dd(1);
////        if ($product) {
//            return $query->where('id', '!=', $product->id)
//                ->where('type', 'product');
////        }
//    }
}