<?php

namespace App\Services;

use Carbon\Carbon;
use Illuminate\Support\Facades\Hash;
use App\Repositories\Interfaces\UserRepositoryInterface;
use App\Repositories\Interfaces\UserProfileRepositoryInterface;

class MyProfileService
{
    protected $userRepository;
    protected $userProfileRepository;

    public function __construct(UserRepositoryInterface $userRepository, UserProfileRepositoryInterface $userProfileRepository)
    {
        $this->userRepository = $userRepository;
        $this->userProfileRepository = $userProfileRepository;
    }

    public function update($request, $loggedUser) {
        $profilePayload = $request->only('first_name', 'last_name');
        $userPayload['updated_by'] = $loggedUser->id;
        $userPayload['updated_at']  = Carbon::now()->toDateTimeString();

        $havePicture = str_contains($request->only('image_url')['image_url'] ,'UIMG');

        if(!$havePicture) {
            $path = 'assets/images/user/';
            $tmpName =  $request->only('image_url');
            $binary_data = base64_decode($tmpName['image_url']);
            $imageName = 'UIMG'.date('Ymd').uniqid().'.jpeg';
            $fileSize = strlen($binary_data);


            if($tmpName['image_url'] == null){
                $this->userProfileRepository->update($tmpName, $loggedUser->id);
            } else if ($fileSize > 2000000) {
                $response = [
                    'status' => 'error',
                    'message' => 'Error! The file is too big.'
                ];

                return $response;

            }else if(!$tmpName['image_url'] == null){
                file_put_contents( $path.$imageName, $binary_data );
                $profilePayload['image_url'] = $imageName;
            }
        }


        $this->userProfileRepository->update($profilePayload, $loggedUser->id);
        $this->userRepository->update($userPayload, $loggedUser->id);

        $response = [
            'status' => 'success',
            'message' => 'Success! Your Account has been updated.'
        ];

        return $response;
    }

    public function crop($request) {
        $image = $request->file('image_url');
        $extension = 'jpg';
        $data = file_get_contents($image);
        $dataUri = 'data:image/' . $extension . ';base64,' . base64_encode($data);

        $fileSize = strlen($dataUri) > 2000000;

        if($fileSize){
            return response()->json(['status'=>0, 'msg'=>'Check File Size, 2mb Maximum']);
        }

        return response()->json(['status'=>1, 'msg'=>$dataUri, 'name'=>$image]);
    }

    public function upload($request, $loggedUserId) {
        $path = 'assets/images/user/';
        $tmpName =  $request->only('mydata');
        $binary_data = base64_decode($tmpName['mydata'] );
        $imageName = 'UIMG'.date('Ymd').uniqid().'.jpeg';
        $fileSize = strlen($binary_data);

        $response = [
            'status' => 'success',
            'message' => 'Success! Your Profile has been updated.'
        ];

        if($tmpName['mydata'] == null){
            $this->userProfileRepository->update(['image_url'=>''], $loggedUserId);
        } else if ($fileSize <= 2000000) {
            file_put_contents( $path.$imageName, $binary_data );

            $this->userProfileRepository->update(['image_url'=>$imageName], $loggedUserId);
        } else {
            $response = [
                'status' => 'errors',
                'message' => 'Error! Could not save image.'
            ];
        }

        return $response;
    }

    public function updatePassword($request, $loggedUser)
    {
        $isMyPassword = $request->only('current_password')['current_password'];
        $newPassword = $request->only('new_password')['new_password'];

        $checkOldPass = Hash::check($isMyPassword, $loggedUser->password);
        $response = [
            'status' => 'errors',
            'message' => 'Invalid Current Password.',
            'redirect' => 'myprofile/change-password'
        ];

        if($checkOldPass) {
            $payload['password'] = Hash::make($newPassword);

            $this->userRepository->update($payload, $loggedUser->id);

            $response = [
                'status' => 'success',
                'message' => 'Success! You succesfully changed your password.',
                'redirect' => 'myprofile'
            ];
        }

        return $response;
    }
}
