<?php

namespace App\Libs\Services;

use App\Libs\Database\Eloquent\Collection\ContentTypeCollection;
use App\Models\WorkGroup;
use Illuminate\Support\Facades\Auth;

class WorkGroupService {
    public function list(array $searchData): ContentTypeCollection {
        $query = WorkGroup::full()
            ->select('work_groups.*', 'work_group_languages.*')
            ->where('status', 'published')
            ->orderBy('work_group_languages.title', 'asc');

        if ($searchData['committeeId']) {
            $query->where('committee_id', $searchData['committeeId']);
        }

        return $query->get();
    }

    public function findBySlug(string $slug): ?WorkGroup {
        $userData = Auth::user();

        $hasLegalOpinionsPermission = $userData->member->user_permission_level
            ? $userData->legal_opinion_permission
            : $userData->member->legal_opinions;

        $hasFinanceSubCommitteePermission = $userData->finance_sub_committee_permission;

        $query = WorkGroup::full()
            ->where('status', 'published')
            ->where('lang_slug', $slug);

        $query->with(['documentLists' => function ($query) use ($userData, $hasLegalOpinionsPermission, $hasFinanceSubCommitteePermission) {
            $query
                ->full()
                ->with(['documents' => function ($query) use ($userData, $hasLegalOpinionsPermission, $hasFinanceSubCommitteePermission) {
                    $query->full()
                        ->where('status', 'published')
                        ->where(function ($query) {
                            $query->where('publish_date', '<=', now()->tz('Europe/Berlin'));
                        })->where(function ($query) {
                            $query->whereNull('expiration_date')
                                ->orWhere('expiration_date', '>', now()->tz('Europe/Berlin'));
                        })
                        ->join('committees', 'committees.id', 'documents.committee_id')
                        ->where(function ($query) use ($userData, $hasLegalOpinionsPermission, $hasFinanceSubCommitteePermission) {
                            $query->where('committees.type', 'standard');

                            if ($userData->member->legal_committee) {
                                $query->orWhere('committees.type', 'legalCommittee');
                            }

                            if ($hasLegalOpinionsPermission) {
                                $query->orWhere('committees.type', 'legalOpinions');
                            }

                            if ($hasFinanceSubCommitteePermission) {
                                $query->orWhere('committees.type', 'financeSubCommittee');
                            }
                        })
                        ->orderBy('publish_date', 'desc');
                }])
                ->orderBy('pivot_position', 'asc');
        }, 'documentListsArchive' => function ($query) use ($userData, $hasLegalOpinionsPermission, $hasFinanceSubCommitteePermission) {
            $query
                ->full()
                ->with(['documents' => function ($query) use ($userData, $hasLegalOpinionsPermission, $hasFinanceSubCommitteePermission) {
                    $query->full()
                        ->where('status', 'published')
                        ->where(function ($query) {
                            $query->where('publish_date', '<=', now()->tz('Europe/Berlin'));
                        })->where(function ($query) {
                            $query->whereNull('expiration_date')
                                ->orWhere('expiration_date', '>', now()->tz('Europe/Berlin'));
                        })
                        ->join('committees', 'committees.id', 'documents.committee_id')
                        ->where(function ($query) use ($userData, $hasLegalOpinionsPermission, $hasFinanceSubCommitteePermission) {
                            $query->where('committees.type', 'standard');

                            if ($userData->member->legal_committee) {
                                $query->orWhere('committees.type', 'legalCommittee');
                            }

                            if ($hasLegalOpinionsPermission) {
                                $query->orWhere('committees.type', 'legalOpinions');
                            }

                            if ($hasFinanceSubCommitteePermission) {
                                $query->orWhere('committees.type', 'financeSubCommittee');
                            }
                        })
                        ->orderBy('publish_date', 'desc');
                }])
                ->orderBy('pivot_position', 'asc');
        }]);

        return $query->first();
    }

    public function getEmails(array $data): array
    {
        $workgroupId = $data['id'];
        $type = $data['type']; // 'to' or 'cc'

        $workgroup = WorkGroup::find($workgroupId);

        if (!$workgroup) {
            return [];
        }

        return $workgroup->users()
            ->wherePivot('type', $type)
            ->whereNotNull('email')
            ->where('email', '!=', '')
            ->where('state', 'active')
            ->orderBy('email', 'asc')
            ->pluck('email')
            ->toArray();
    }
}
