<?php

namespace App\Libs\Services;

use App\Models\BusinessCard;
use Illuminate\Support\Facades\DB;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Str;
use Throwable;

class BusinessCardService
{
    /**
     * Get the business card list for the backoffice grid
     *
     * @param $page
     * @param $rowCount
     * @param $sort
     * @param $search
     *
     * @return array
     */
    public function getBusinessCardGridList($page, $rowCount, $sort, $search)
    {
        Paginator::currentPageResolver( function () use ($page) {
            return $page;
        });

        if (!empty($search)) {
            $query = BusinessCard::where(function ($query) use ($search) {
                $query->orWhere('name', 'like', "%{$search}%");
            });
        } else {
            $query = BusinessCard::query();
        }

        if (empty($sort)) {
            $rows = $query->paginate($rowCount);
        } else {
            foreach ($sort as $field => $direction) {
                if(empty($direction) || !Str::is(strtolower($direction),"desc")){
                    $orderDirection = "asc";
                } else {
                    $orderDirection = $direction;
                }
                $rows = $query->orderBy($field, strtolower($orderDirection))->paginate($rowCount);
                break;
            }
        }

        return [
            "total"             => $rows->total(),
            "current"           => $rows->currentPage(),
            "rowCount"          => $rowCount,
            "rows"              => $rows->getCollection()
        ];
    }

    public function createBusinessCard($data)
    {
        $businessCard = new BusinessCard();
        return $this->_fillBusinessCardData($businessCard, $data);
    }

    public function editBusinessCard($businessCardId, $data)
    {
        $businessCard = BusinessCard::findOrFail($businessCardId);
        return $this->_fillBusinessCardData($businessCard, $data);
    }

    protected function _fillBusinessCardData(BusinessCard $businessCard, $data)
    {
        DB::beginTransaction();

        try {
            $loggedUser = BackendUserService::getLoggedUser();

            $businessCard->backend_user_id = $loggedUser->id;
            $businessCard->name = $data["name"];
            $businessCard->role = $data["role"];
            $businessCard->phone = $data['phone'];
            $businessCard->email = $data['email'];
            $businessCard->website = $data["website"];
            $businessCard->address = $data["address"];
            $businessCard->slug = $data["slug"];
            $businessCard->logo_lang = $data["logo_lang"];

            $businessCard->save();

            DB::commit();
        } catch (Throwable $e) {
            DB::rollback();
            throw($e);
        }

        return $businessCard;
    }

    public function list(array $searchData) {
        $orderDir = $searchData['orderDir'] ? $searchData['orderDir'] : 'asc';

        $query = BusinessCard::select('*');

        switch ($searchData['orderBy']) {
            default:
                # name
                $query->orderBy('name', $orderDir);
                break;
        }

        $members = $query->get();
        return $members;
    }

    public function findById(string $id): ?BusinessCard {
        $query = BusinessCard::where('id', $id);
        return $query->first();
    }

    public function findByIdCommittees(string $id): ?BusinessCard {
        $query = BusinessCard::where('id', $id);
        return $query->first();
    }

}
