<?php

namespace App\Libs\Services;

use App\Models\RatificationLetter;
use Illuminate\Support\Facades\Auth;

class SearchRatificationLetterService
{
    public function getSearchRatificationLetters($data)
    {
        $authUser = Auth::user();
        $orderDir = $data['orderDir'] ? $data['orderDir'] : 'asc';
        $query = RatificationLetter::query();
        $query->where('letter_id', $data['letterId']);

        $query->leftJoin('users', 'users.id', '=', 'ratification_letters.user_id')
            ->leftJoin('legal_entities', 'legal_entities.id', '=', 'ratification_letters.legal_entity_id')
            ->leftJoin('companies', 'companies.id', '=', 'ratification_letters.company_id')
            ->select(
                'ratification_letters.*',
                'users.company_name',
                'legal_entities.legal_entity',
                'companies.name as company_name_alias'
            );

        if ($authUser && $authUser->role === 'user') {
            $query->where(function ($query) use ($authUser) {
                $query->where('ratification_letters.user_id', $authUser->id)
                    ->orWhere(function ($query) {
                        $query->where('status', 'approved');
                    });
            });
        }

        if (! empty($data['q'])) {
            $q = $data['q'];
            $query->where(function ($sub) use ($q) {
                $sub->where('legal_entities.legal_entity', 'LIKE', "%{$q}%")
                    ->orWhere('users.company_name', 'LIKE', "%{$q}%")
                    ->orWhere('companies.name', 'LIKE', "%{$q}%")
                    ->orWhere('ratification_letters.title', 'LIKE', "%{$q}%");
            });
        }

        switch ($data['orderBy']) {
            case 'statusUpdatedAt':
                $query->orderBy('status_updated_at', $orderDir);
                break;
            case 'createAt':
                $query->orderBy('created_at', $orderDir);
                break;
            default:
                // company_name
                $query->orderByRaw("CASE
                    WHEN legal_entities.legal_entity IS NOT NULL
                        THEN CONCAT(legal_entities.legal_entity, ' ', COALESCE(users.company_name, ''), ' ', ratification_letters.title)
                    WHEN users.company_name IS NOT NULL
                        THEN CONCAT(users.company_name, ' ', COALESCE(legal_entities.legal_entity, ''), ' ', ratification_letters.title)
                    ELSE
                        ratification_letters.title
                    END {$orderDir}");
                break;
        }

        $perPage = $data['perPage'] ?? 12;
        $page = $data['page'] ?? 1;

        $ratificationLetters = $query->paginate($perPage, ['*'], 'page', $page);

        $paginationData = [
            'currentPage' => intval($ratificationLetters->currentPage()),
            'lastPage' => intval($ratificationLetters->lastPage()),
            'perPage' => intval($ratificationLetters->perPage()),
            'total' => intval($ratificationLetters->total()),
            'count' => intval($ratificationLetters->count()),
            'hasMorePages' => $ratificationLetters->hasMorePages(),
            'nextPageUrl' => $ratificationLetters->nextPageUrl(),
            'prevPageUrl' => $ratificationLetters->previousPageUrl(),
        ];

        return [
            'ratificationLetters' => $ratificationLetters,
            'pagination' => $paginationData,
        ];
    }
}
