<?php

namespace Modules\Attribute\Services;

use Illuminate\Http\Request;
use Modules\Attribute\Interfaces\AttributeRepositoryInterface;
use Modules\Attribute\Models\Attribute;

class AttributeService
{
    private AttributeRepositoryInterface $attributeRepository ;

    public function __construct(AttributeRepositoryInterface $attributeRepository)
    {
        $this->attributeRepository = $attributeRepository;
    }

    public function get(array $request = [])
    {
        $builder = $this->attributeRepository->get($request);

        if (@$request['title'])
        {
            $builder->where('sd.title', 'LIKE', '%'.$request['title'].'%');
        }
        if (@$request['date_from'])
        {
            $builder->whereDate('attributes.created_at', '>=', $request['date_from']);
        }

        if (@$request['date_to'])
        {
            $builder->whereDate('attributes.created_at', '<=', $request['date_to']);
        }

        if (isset($request['status']))
        {
            if (@$request['status'] == 0)
            {
                $builder->onlyTrashed();
            }
        }

        if (@$request['orderBy'])
        {
            $builder->orderBy($request['orderBy']['key'],$request['orderBy']['value']);
        }
        else
        {
            $builder->orderBy('id','DESC');
        }

        if (@$request['paginate']) {
            $attributes= $builder->paginate(50);
        }else{
            $attributes=$builder->cursor();
        }
        return $attributes;
    }
    public function checkItem($id)
    {
        $attribute = $this->attributeRepository->checkItem($id);
        return $attribute;
    }

    public function getItem($id)
    {
        $attribute = $this->checkItem($id);
        $attributeDescription = $this->attributeRepository->getItem($id);
        foreach ($attributeDescription as $row) {
            $attribute[$row->local]= $row;
        }
        return $attribute;
    }

    public function getItemTrashed($id)
    {
        $attribute = $this->attributeRepository->getItemTrashed($id);
        return $attribute;
    }

    public function create(array $request): Attribute
    {
        $attribute = $this->attributeRepository->create($request);

        if (isset($request['choices']))
        {
            $this->attributeRepository->updateOptions($request,$attribute);
        }

        $this->attributeRepository->saveData($request,$attribute->id);
        return $attribute;
    }
    public function update(array $request,int $id): Attribute
    {
        $attribute = $this->checkItem($id);

        if (isset($request['choices']))
        {
            $this->attributeRepository->updateOptions($request,$attribute);
        }

        $attribute = $this->attributeRepository->update($request,$attribute);
        $this->attributeRepository->saveData($request,$attribute->id);
        return $attribute;
    }

    public function choices(int $attribute_id)
    {
        $attribute = $this->getItem($attribute_id);
        return $this->attributeRepository->choices($attribute);
    }

    public function destroy(int $id): void
    {
        $attribute = $this->checkItem($id);
        if ($attribute)
        {
            $this->attributeRepository->destroy($attribute);
        }
        else
        {
            $attribute = $this->getItemTrashed($id);
            $this->attributeRepository->restore($attribute);
        }
    }
    public function destroyAll(array $request): void
    {
        if ($request['status'] == 1)
        {
            $this->attributeRepository->destroyAll($request['ids']);
        }
        else
        {
            $this->attributeRepository->restoreAll($request['ids']);
        }
    }
}
