<?php

namespace App\Http\Controllers\Admin;

use App\Facades\RequestContext;
use App\Http\Controllers\Controller;
use App\Http\Requests\MemberStore;
use App\Libs\Services\BackendUserService;
use App\Libs\Services\MemberService;
use App\Libs\Transformers\Member\MemberTransformer;
use App\Models\Committee;
use App\Models\Country;
use App\Models\Member;
use App\Models\WorkGroup;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Spatie\Fractal\Facades\Fractal;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\MembersExport;
use App\Models\Domain;
use App\Models\User;

class MemberController extends Controller
{
    use UserManageTrait;

    public function getIndex(BackendUserService $backendUserService)
    {
        $loggedUser = $backendUserService->getLoggedUser();

        $workGroups = WorkGroup::full()
            ->where('status', 'published')
            ->get();
        $workGroupsArray = [];
        foreach ($workGroups as $value) {
            $workGroupsArray[$value->id] = $value->title;
        }

        $committees = Committee::full()
            ->where('status', 'published')
            ->get();
        $committeesArray = [];
        foreach ($committees as $value) {
            $committeesArray[$value->id] = $value->title;
        }

        return view('admin.pages.members.members', [
            'canInsert'     => $loggedUser->hasPermission('users.insert'),
            'loggedUser'    => $loggedUser,
            'workGroups'    => $workGroupsArray,
            'committees'    => $committeesArray
        ]);
    }

    public function postList(Request $request, MemberService $memberService)
    {
        $page = $request->input("current");
        $rowCount = $request->input("rowCount");
        $sort = $request->input("sort");
        $search = $request->input("searchPhrase");
        $type = $request->input("type");
        $status = $request->input("status");
        $wg = $request->input("wg");
        $committee = $request->input("committee");
        $legalCommittee = $request->input("legalCommittee");
        $legalOpinions = $request->input("legalOpinions");

        if (!empty($page)) {
            $result = $memberService->getMemberGridList($page, $rowCount, $sort, $search, $type, $status, $wg, $committee, $legalCommittee, $legalOpinions);
            $result["rows"] = Fractal::collection($result["rows"])
                ->transformWith(new MemberTransformer())->toArray();

            return response()->json($result);
        } else {
            $members = Member::all();
            return response()->json(Fractal::collection($members)
                ->transformWith(new MemberTransformer())->toArray());
        }
    }

    public function getEdit($memberId = null)
    {
        $loggedUser = BackendUserService::getLoggedUser();

        if (!empty($memberId) && $loggedUser->id != $memberId
            && !$loggedUser->hasPermission("users.view")
            && !$loggedUser->hasPermission("users.insert")) {
            abort(403);
        }

        $canManage = $this->_canManage($memberId);
        $canEdit   = $this->_canEdit($memberId);

        RequestContext::set('selected_menu', 'admin');
        RequestContext::set('selected_menu_option', 'list_users');

        if (!empty($memberId)) {
            $member = Member::find($memberId);
        } else {
            $member = new Member();
        }

        if(empty($member)){
            abort(404);
        }

        $listCountries = Country::all();
        $list = ['' => 'Select a country'];
        foreach ($listCountries as $value) {
            $list[$value->id] = $value->title;
        }

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

        $committees = [];
        foreach ($member->committees as $value) {
            array_push($committees, $value->id);
        }

        $workGroups = [];
        foreach ($member->workGroups as $value) {
            array_push($workGroups, $value->id);
        }

        $domains = [];
        $postData = old();
        if (empty($postData)) {
            foreach ($member->domains as $value) {
                array_push($domains, $value->domain);
            }
        } else {
            $domains = $postData['domain'];
        }

        return view('admin.pages.members.member_form', [
            'listCountries'  => $list,
            'listCommittees' => $listCommittees,
            'member'         => $member,
            'workGroups'     => $workGroups,
            'committees'     => $committees,
            'domains'        => $domains,
            'canManage'      => $canManage,
            'canEdit'        => $canEdit,
            'canView'        => $loggedUser->hasPermission("users.view")
        ]);
    }

    public function postEdit(MemberStore $request, MemberService $memberService, $memberId = null)
    {
        $data = $request->validated();
        $workGroups = $request->input('wg', []);
        $data['workGroups'] = $workGroups;

        $committees = $request->input('com', []);
        $data['committees'] = $committees;

        $domains = $request->input('domain', []);
        $data['domains'] = $domains;

        if(!empty($memberId)){
            $member = $memberService->editMember($memberId, $data);
            $message = "Member updated";

            if ($request->input('member_type') === 'associate') {
                $associateUserIds = DB::table('users')
                    ->join('members', 'users.member_id', '=', 'members.id')
                    ->where('members.member_type', 'associate')
                    ->pluck('users.id');

                DB::table('user_work_group')
                    ->whereIn('user_id', $associateUserIds)
                    ->update(['type' => 'cc']);

                DB::table('committee_user')
                    ->whereIn('user_id', $associateUserIds)
                    ->update(['type' => 'cc']);
            }
        } else {
            $member = $memberService->createMember($data);
            $message = "Member created";
        }

        return redirect('/admin/admin-members/edit/' . $member->id)
            ->with("message", $message);
    }

    public function getExportMembers(Request $request)
    {
        $status = $request->input("status");
        $wg = $request->input("wg");
        $type = $request->input("type");

        return Excel::download(new MembersExport($status, $wg, $type), 'members.xlsx');
    }

    public function postDelete(Request $request)
    {
        $id = $request->input("id");
        $member = Member::find($id);

        if(!empty($member)) {
            User::where('member_id', $id)->delete();
            Domain::where('member_id', $id)->delete();
            $member->delete();
        }

        return response()->json(["success" => true]);
    }
}
