<?php
namespace App\Exports;

use App\Models\Committee;
use App\Models\User;
use App\Models\WorkGroup;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;

class UsersBackofficeExport implements FromCollection, WithHeadings, WithMapping
{
    protected $status;
    protected $wg;
    protected $committee;
    protected $memberId;
    protected $committees;
    protected $workGroups;

    public function __construct($status = "", $wg = 0, $committee = 0, $memberId = 0) {
        $this->status = $status;
        $this->wg = intval($wg);
        $this->committee = intval($committee);
        $this->memberId = intval($memberId);

        $this->committees = Committee::full()
            ->where('status', 'published')
            ->get();

        $this->workGroups = WorkGroup::full()
            ->where('status', 'published')
            ->get();
    }

    public function collection()
    {
        $query = User::query();

        $query->with([
            'workGroups' => function ($query) {
                $query->full()->where('status', 'published');
            },
            'committees' => function ($query) {
                $query->full()->where('status', 'published');
            },
        ]);

        if (!empty($this->status)) {
            $query->where('state', $this->status);
        }

        if (!empty($this->wg) && $this->wg > 0) {
            $wg = $this->wg;
            $query->whereExists(function ($query) use ($wg) {
                $query->select('work_group_id')
                    ->from('user_work_group')
                    ->where('work_group_id', $wg)
                    ->whereRaw('user_work_group.user_id = users.id');
            });
        }

        if (!empty($this->committee) && $this->committee > 0) {
            $committee = $this->committee;
            $query->whereExists(function ($query) use ($committee) {
                $query->select('committee_id')
                    ->from('committee_user')
                    ->where('committee_id', $committee)
                    ->whereRaw('committee_user.user_id = users.id');
            });
        }

        if (!empty($this->memberId)) {
            $query->where('member_id', $this->memberId);
        }

        $query->orderBy('name', 'asc');
        return $query->get();
    }

    public function headings(): array
    {
        $headers = [
            'ID',
            'Name',
            'Last Name',
            'E-mail',
            'Department',
            'Function',
            'Phone Number',
            'State',
            'Member Name',
            'Create Date',
        ];

        foreach ($this->committees as $committee) {
            $headers[] = $committee->title;
        }

        foreach ($this->workGroups as $workGroup) {
            $headers[] = $workGroup->title;
        }

        return $headers;
    }

    public function map($user): array
    {
        $results = [
            $user->id,
            $user->name,
            $user->last_name,
            $user->email,
            $user->department,
            $user->function,
            $user->phone_number,
            $user->state,
            $user->member->name,
            $user->created_at->toDateTimeString(),
        ];

        $userCommitteeIds = $user->committees->pluck('id')->toArray();

        foreach ($this->committees as $committee) {
            $hasCommittee = 'no';

            if (in_array($committee->id, $userCommitteeIds)) {
                $hasCommittee = 'yes';
            }

            $results[] = $hasCommittee;
        }

        foreach ($this->workGroups as $workGroup) {
            $hasWorkGroupType = '-';
            foreach ($user->workGroups as $userWorkGroups) {
                if ($userWorkGroups->id === $workGroup->id) {
                    $hasWorkGroupType = $userWorkGroups->pivot->type;
                    break;
                }
            }

            $results[] = $hasWorkGroupType;
        }

        return $results;
    }
}
