<?php
 
 
namespace App\Service;
 
 
use Symfony\Component\DependencyInjection\ContainerInterface;
 
use Doctrine\ORM\EntityManagerInterface;
 
use Symfony\Component\HttpFoundation\RedirectResponse;
 
use App\Entity\UserEntity;
 
 
Class AuthService {
 
 
    private $em;
 
    private $container;
 
 
    public function __construct(EntityManagerInterface $em, ContainerInterface $container) {
 
 
        $this->em = $em;
 
        $this->container = $container;
 
    }
 
 
    // Original PHP code by Chirp Internet: www.chirp.com.au
 
    public function better_crypt($input, $rounds = 7)
 
    {
 
        $salt = "";
 
        $salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9));
 
        for($i=0; $i < 22; $i++) {
 
            $salt .= $salt_chars[array_rand($salt_chars)];
 
        }
 
        return crypt($input, sprintf('$2a$%02d$', $rounds) . $salt);
 
    }
 
 
    /**
 
     * Checks if the user is logged in or not
 
     */
 
    public function isLoggedIn($requestUri = true) {
 
 
        $session = $this->container->get('session');
 
 
        if($session->has('userData')) {
 
            return true;
 
        } else {
 
            if($requestUri) {
 
                $req_uri = $_SERVER['REQUEST_URI'];
 
                if($req_uri !== $this->container->get('router')->generate('home_login') &&
 
                    $req_uri !== $this->container->get('router')->generate('home_logout') &&
 
                    $req_uri !== $this->container->get('router')->generate('home_forgot_password') &&
 
                    //$req_uri !== $this->container->get('router')->generate('auth_forgot_password_confirmation') &&
 
                    strpos($req_uri, 'ajax') === false) $session->set('req_uri', $req_uri);
 
            }
 
            return false;
 
        }
 
    }
 
 
    /**
 
     * Checks if the user has the ess
 
     */
 
    public function isUserHasAccesses($accessDescriptions, $hasErrorMsg=true, $matchCtr=false) {
 
        $session = $this->container->get('session');
 
        //$session->save(); // This will automatically call session_write_close() to prevent session lock timeout error
 
        $userData = $session->get('userData');
 
        if($userData['type'] === 'Super Admin') {
 
            return true;
 
        } else {
 
            if($matchCtr) {
 
                $accessCtr = 0;
 
                foreach($accessDescriptions as $accessDescription) if(in_array($accessDescription, $userData['accesses'])) $accessCtr++;
 
                $hasAccess = count($accessDescriptions) === $accessCtr;
 
                if(!$hasAccess) {
 
                    if($hasErrorMsg) {
 
                        $session->getFlashBag()->set('error_messages', "You don't have the right to access the page. Please contact the administrator.");
 
                    }
 
                    return false;
 
                } else {
 
                    return true;
 
                }
 
            } else {
 
                foreach($accessDescriptions as $accessDescription) if(in_array($accessDescription, $userData['accesses'])) return true;
 
                if($hasErrorMsg) $session->getFlashBag()->set('error_messages', "You don't have the right to access the page. Please contact the administrator.");
 
                return false;
 
            }
 
        }
 
    }
 
 
    /**
 
     * Redirects to login page
 
     */
 
    public function redirectToLogin() {
 
 
        return new RedirectResponse($this->container->get('router')->generate('home_login'), 302);
 
    }
 
 
    /**
 
     * Redirects to registration page
 
     */
 
    public function redirectToRegistration() {
 
 
        return new RedirectResponse($this->container->get('router')->generate('frontend_registration'), 302);
 
    }
 
 
    /**
 
     * Redirects to home page
 
     */
 
    public function redirectToHome() {
 
 
        return new RedirectResponse($this->container->get('router')->generate('admin'), 302);
 
    }
 
 
    /**
 
     * Get user
 
     */
 
    public function getUser() {
 
 
        $userData = $this->container->get('session')->get('userData');
 
        return $this->em->getRepository(UserEntity::class)->find($userData['id']);
 
    }
 
 
    /**
 
     * Get user types
 
     */
 
    public function getUserTypes() {
 
 
        return array(
 
            'Admin',
 
            'Staff',
 
            'Agent',
 
            'Public',
 
            'Guest',
 
        );
 
    }
 
 
    public function getAccesses() {
 
 
        return array(
 
            array('label' => 'Admin', 'description' => 'Admin', 'children' => array(
 
                array('label' => 'Manage Users', 'description' => 'Admin Users', 'children' => array(
 
                    array('label' => 'User', 'description' => 'Admin User', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin User New'),
 
                        array('label' => 'Update', 'description' => 'Admin User Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin User Delete'),
 
                    )),
 
                )),
 
                array('label' => 'Manage Property Listing', 'description' => 'Admin Property Listing', 'children' => array(
 
                    array('label' => 'Export to Excel', 'description' => 'Admin Property Listing Export To Excel'),
 
                    array('label' => 'New', 'description' => 'Admin Property Listing New'),
 
                    array('label' => 'Update', 'description' => 'Admin Property Listing Update'),
 
                    array('label' => 'Delete', 'description' => 'Admin Property Listing Delete'),
 
                    array('label' => 'Remarks', 'description' => 'Admin Property Listing Remark'),
 
                )),
 
                array('label' => 'Manage Deleted Property Listing', 'description' => 'Admin Deleted Property Listing'),
 
                array('label' => 'Manage Search', 'description' => 'Admin Search'),
 
                array('label' => 'Manage Inquiry Record', 'description' => 'Admin Inquiry Record'),
 
                array('label' => 'Inquiry', 'description' => 'Admin Inquiry'),
 
                array('label' => 'Print', 'description' => 'Admin Print'),
 
                array('label' => 'Manage CMS', 'description' => 'Admin Cms', 'children' => array(
 
                    array('label' => 'Manage Property Listing Type', 'description' => 'Admin Property Listing Type', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Property Listing Type New'),
 
                        array('label' => 'Update', 'description' => 'Admin Property Listing Type Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Property Listing Type Delete'),
 
 
                    )),
 
                    array('label' => 'Manage Property ID', 'description' => 'Admin Property ID', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Property ID New'),
 
                        array('label' => 'Update', 'description' => 'Admin Property ID Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Property ID Delete'),
 
 
                    )),
 
                    array('label' => 'Manage Building', 'description' => 'Admin Building', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Building New'),
 
                        array('label' => 'Update', 'description' => 'Admin Building Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Building Delete'),
 
                    )),
 
                    array('label' => 'Manage City', 'description' => 'Admin City', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin City New'),
 
                        array('label' => 'Update', 'description' => 'Admin City Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin City Delete'),
 
                    )),
 
                    array('label' => 'Manage Tower', 'description' => 'Admin Tower', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Tower New'),
 
                        array('label' => 'Update', 'description' => 'Admin Tower Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Tower Delete'),
 
                    )),
 
                    array('label' => 'Manage Parking Space', 'description' => 'Admin Parking Space', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Parking Space New'),
 
                        array('label' => 'Update', 'description' => 'Admin Parking Space Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Parking Space Delete'),
 
                    )),
 
                    array('label' => 'Manage Contact Type', 'description' => 'Admin Contact Type', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Contact Type New'),
 
                        array('label' => 'Update', 'description' => 'Admin Contact Type Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Contact Type Delete'),
 
                    )),
 
                    array('label' => 'Manage Remark', 'description' => 'Admin Remark', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Remark New'),
 
                        array('label' => 'Update', 'description' => 'Admin Remark Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Remark Delete'),
 
                    )),
 
                    array('label' => 'Manage Title', 'description' => 'Admin Title', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Title New'),
 
                        array('label' => 'Update', 'description' => 'Admin Title Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Title Delete'),
 
                    )),
 
                    array('label' => 'Manage Type', 'description' => 'Admin Type', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Type New'),
 
                        array('label' => 'Update', 'description' => 'Admin Type Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Type Delete'),
 
                    )),
 
                    array('label' => 'Manage Furnishing', 'description' => 'Admin Furnished', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Furnished New'),
 
                        array('label' => 'Update', 'description' => 'Admin Furnished Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Furnished Delete'),
 
                    )),
 
                    array('label' => 'Manage Status', 'description' => 'Admin Status', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Status New'),
 
                        array('label' => 'Update', 'description' => 'Admin Status Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Status Delete'),
 
                    )),
 
                    array('label' => 'Manage Ownership', 'description' => 'Admin Ownership', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Ownership New'),
 
                        array('label' => 'Update', 'description' => 'Admin Ownership Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Ownership Delete'),
 
                    )),
 
                    array('label' => 'Manage Barangay', 'description' => 'Admin Barangay', 'children' => array(
 
                        array('label' => 'New', 'description' => 'Admin Barangay New'),
 
                        array('label' => 'Update', 'description' => 'Admin Barangay Update'),
 
                        array('label' => 'Delete', 'description' => 'Admin Barangay Delete'),
 
                    ))
 
                )),
 
            )),
 
        );
 
    }
 
 
    /**
 
     * Checks if the user is logged in or not
 
     */
 
    public function accountIsLoggedIn($requestUri = true) {
 
 
        $session = $this->container->get('session');
 
 
        if($session->has('accountUserData')) {
 
            return true;
 
        } else {
 
            if($requestUri) {
 
                $req_uri = $_SERVER['REQUEST_URI'];
 
                if($req_uri !== $this->container->get('router')->generate('home_login') &&
 
                    $req_uri !== $this->container->get('router')->generate('home_logout') &&
 
                    $req_uri !== $this->container->get('router')->generate('home_forgot_password') &&
 
                    //$req_uri !== $this->container->get('router')->generate('auth_forgot_password_confirmation') &&
 
                    strpos($req_uri, 'ajax') === false) $session->set('req_uri', $req_uri);
 
            }
 
            return false;
 
        }
 
    }
 
 
    /**
 
     * Redirects to login page of user
 
     */
 
    public function account_redirectToLogin() {
 
 
        return new RedirectResponse($this->container->get('router')->generate('admin'), 302);
 
    }
 
 
    public function calculateDaysEarned($amount, $startDate, $endDate){
 
 
        $today = new \DateTime();  
 
        $daysPassed = $today->diff($startDate)->days;
 
        $days = $endDate->diff($startDate)->days;
 
        $earnedPerDays = round(($amount / $days), 2);
 
 
        if($daysPassed > 0 && $endDate >= $today){ 
 
            return $daysPassed * $earnedPerDays;
 
        }
 
        
 
        return 0;
 
    }
 
}