<?php

namespace App\Services;

use App\Repositories\Interfaces\ProfessionalRepositoryInterface;
use App\Repositories\Interfaces\UserRepositoryInterface;
use App\Repositories\Interfaces\UserProfileRepositoryInterface;
use App\Repositories\Interfaces\ProfessionalIdRepositoryInterface;
use App\Repositories\Interfaces\ProfessionalOfficeRepositoryInterface;
use App\Repositories\Interfaces\ProfessionalScheduleRepositoryInterface;
use App\Repositories\Interfaces\ProfessionRepositoryInterface;

class ProfessionalService
{

    protected $professionalRepository;
    protected $userRepository;
    protected $userProfileRepository;
    protected $professionRepository;
    protected $professionalIdRepository;
    protected $professionalOfficeRepository;
    protected $professionalScheduleRepository;
    protected $emailService;

    public function __construct(ProfessionalRepositoryInterface $professionalRepository,
        UserRepositoryInterface $userRepository,
        UserProfileRepositoryInterface $userProfileRepository,
        ProfessionalIdRepositoryInterface $professionalIdRepository,
        ProfessionRepositoryInterface $professionRepository,
        ProfessionalOfficeRepositoryInterface $professionalOfficeRepository,
        ProfessionalScheduleRepositoryInterface $professionalScheduleRepository,
        EmailService $emailService
    ) {
        $this->professionalIdRepository = $professionalIdRepository;
        $this->professionalRepository = $professionalRepository;
        $this->userRepository = $userRepository;
        $this->userProfileRepository = $userProfileRepository;
        $this->professionRepository = $professionRepository;
        $this->professionalOfficeRepository = $professionalOfficeRepository;
        $this->professionalScheduleRepository = $professionalScheduleRepository;
        $this->emailService = $emailService;

    }

    public function viewProfile($id)
    {

        $professional = $this->professionalRepository->find($id);
        $user = $this->userRepository->find($professional->user_id);

        $userProfile = $this->userProfileRepository->getByUser($professional->user_id);

        if ($professional->profession_id) {
            $profession = $this->professionRepository->find($professional->profession_id);
            $profession->specialty = $professional->specialty > 0 ? $this->professionRepository->find($professional->specialty)->name : "N/A";
            $response['profession'] = $profession;
        }

        $professionalId = $this->professionalIdRepository->getByProfessionalId($professional->id);

        $professionalOffice = $this->professionalOfficeRepository->getByProfessional($professional->id);

        $response['professional'] = $professional;
        $response['user'] = $user;
        $response['userProfile'] = $userProfile;
        $response['professionalIds'] = $professionalId;
        $response['professionalOffice'] = $professionalOffice;

        return $response;
    }

    public function getAllProfessionals()
    {
        $professionals = $this->professionalRepository->all();
        return $professionals;
    }

    public function getByProfession($professionId)
    {
        $professionals = $this->professionalRepository->getByProfession($professionId);
        return $professionals;
    }

    public function updateStatus($professionalId, $status)
    {
        $payload = [ 'status' => $status ];

        $this->professionalRepository->update($payload, $professionalId);

        $professional = $this->professionalRepository->find($professionalId);

        $user = $this->userRepository->find($professional->user_id);

        $setPasswordLink = config('desxpert.fe_url').'/account/set-password?plink='.strrev(base64_encode($user->email)).'&isp='.base64_encode($user->uuid);

        $emailInfo = [
            'name' => $user->profile->first_name . " " . $user->profile->last_name,
            'email' => $user->email,
            'isp' => $user->social_site === 'desxpert' ? $setPasswordLink : ""
        ];

        $emailContent = $status === 'approved' ? 'professional-approved' : 'professional-declined';

        $this->emailService->sendEmail($emailContent, $emailInfo);

        $response = [
            'status' => 'success',
            'message' => 'Success! The professional has been '.$status
        ];

        return $response;
    }

    public function viewApplication($id)
    {
        $professional = $this->professionalRepository->find($id);

        $userProfile = $this->userProfileRepository->getByUser($professional->user_id);

        $professionalId = $this->professionalIdRepository->getByProfessionalId($professional->id);

        $professional->offices = $this->professionalOfficeRepository->getByProfessional($professional->id);

        $professional->schedules = $this->professionalScheduleRepository->getByProfessionalUserId($professional->user_id);

        $identity = [];

        foreach($professionalId as $profId) {
            $identity[$profId->type] = $profId->value;
        }

        $professional->prc_number = count($identity) > 0 ? $identity['PRC'] : 'N/A';
        $professional->prc_id = config('desxpert.api_url').'/professionals/prc-id/'.$professional->user_id;
        $professional->signature = config('desxpert.api_url').'/professionals/signature/'.$professional->user_id;
        $professional->selfie = config('desxpert.api_url').'/professionals/prc-id-selfie/'.$professional->user_id;

        return $professional;
    }

    public function getList()
    {
        return $this->professionalRepository->getList();
    }
}
