<?php

namespace App\Repositories;

use App\Models\Member;
use Illuminate\Support\Facades\Hash;
use Ramsey\Uuid\Uuid;
use Carbon\Carbon;

class MemberRepository
{
    protected $model;

    public function __construct(Member $model)
    {
        $this->model = $model;
    }

    public function getAll()
    {
        return $this->model::all();
    }

    public function get($uuid)
    {
        return $this->model::where("uuid", $uuid)->first();
    }

    public function edit($request)
    {
        //get member to edit
        $member = $this->get($request->id);

        //save new avi if available
        $publicPath = '../public/';
        $refPath    = 'assets/images/members/' . $member->uuid;
        if ($request->hasfile("fresh_avi")) {
            $file = $request->fresh_avi;
            if (!is_dir($publicPath . $refPath)) {
                mkdir($publicPath . $refPath, 0755, true);
            }
            $filename = urlencode($file->getClientOriginalName());
            $file->move($publicPath . $refPath, $filename);
            $freshAvi       = '/' . $refPath . '/' . $filename;
            $member->avatar = $freshAvi;
        }

        $member->handle  = $request->handle;
        $member->email   = $request->email;
        $member->pronoun = $request->pronouns;
        $member->role    = $request->role;
        $member->active  = $request->status;

        if ($member->save()) {
            return ['status' => true, 'message' => "Member Editited"];
        } else {
            return ['status' => false, 'message' => "Member Not Editited"];
        }
    }

    public function add($request)
    {
        $password  = [];
        $newFriend = [];
        if ($request->fresh_pass === $request->fresh_pass_confirm) {
            $password = Hash::make($request->fresh_pass);
        } else {
            return ['status' => false, 'message' => "Passwords Do Not Match"];
        }

        //if role paramter is set, not an admin add
        if (isset($request->role)) {
            $newFriend = $this->model::create([
                'uuid'       => Uuid::uuid4(),
                'avatar'     => 'default-member-avatar',
                'handle'     => $request->handle,
                'email'      => $request->email,
                'pronoun'    => $request->pronouns,
                'role'       => $request->role,
                'active'     => $request->status,
                'password'   => $password,
                'created_at' => Carbon::now(),
                'last_login' => Carbon::now(),
            ]);
        } else {
            //set up admin
            $newFriend = $this->model::create([
                'uuid'       => Uuid::uuid4(),
                'avatar'     => 'default-member-avatar',
                'handle'     => $request->handle,
                'email'      => $request->email,
                'pronoun'    => $request->pronouns,
                'role'       => 0,
                'active'     => true,
                'password'   => $password,
                'created_at' => Carbon::now(),
                'last_login' => Carbon::now(),
            ]);
        }

        if ($newFriend) {
            return ['status' => true, 'message' => "New Friend Made!"];
        } else {
            return ['status' => false, 'message' => "Uh oh, New Friend Delay!"];
        }
    }

    public function editProfile($request)
    {
        //get member to edit
        $member = $this->get($request->id);

        //save new avi if available
        $publicPath = '../public/';
        $refPath    = 'assets/images/members/' . $member->uuid;
        if ($request->hasfile("fresh_avi")) {
            $file = $request->fresh_avi;
            if (!is_dir($publicPath . $refPath)) {
                mkdir($publicPath . $refPath, 0755, true);
            }
            $filename = urlencode($file->getClientOriginalName());
            $file->move($publicPath . $refPath, $filename);
            $freshAvi       = '/' . $refPath . '/' . $filename;
            $member->avatar = $freshAvi;
        }
        //changing password
        if (isset($request->fresh_pass) && $request->fresh_pass !== '') {
            if ($request->fresh_pass === $request->fresh_pass_confirm) {
                $member->password = Hash::make($request->fresh_pass);
            } else {
                return ['status' => false, 'message' => "Passwords Do Not Match"];
            }
        }

        $member->handle  = $request->handle;
        $member->email   = $request->email;
        $member->pronoun = $request->pronouns;

        if ($member->save()) {
            return ['status' => true, 'message' => "Profile Editited"];
        } else {
            return ['status' => false, 'message' => "Profile Not Editited"];
        }
    }
}
