<?php

namespace App\Http\Controllers\Api\V3;

use Illuminate\Http\Request;
use App\Exceptions\GeneralException;
use App\Http\Controllers\Controller;
use App\Repositories\Auth\UserRepository;
use App\Repositories\CircleRepository;
use App\Repositories\CircleUserTempRepository;
use App\Repositories\CircleUserRepository;
use App\Repositories\CircleRoundRepository;
use App\Repositories\SiteSettingsRepository;
use App\Repositories\Auth\UserDeviceTokenRepository;
use App\Repositories\MobileCountryCodeRepository;
use App\Repositories\CircleDepositPaymentRepository;
use App\Models\Auth\User;
use Illuminate\Support\Facades\Mail;

/**
 * Class CircleApiControllerV3.
 */
class CircleApiControllerV3 extends Controller
{
    /**
     * @var UserRepository
     * @var CircleUserTempRepository
     * @var CircleUserRepository
     * @var CircleRepository
     * @var CircleRoundRepository
     * @var SiteSettingsRepository
     * @var UserDeviceTokenRepository
     * @var MobileCountryCodeRepository
     * @var CircleDepositPaymentRepository
     */
    protected $userRepository;
    protected $circleUserTempRepository;
    protected $circleUserRepository;
    protected $circleRepository;
    protected $circleRoundRepository;
    protected $siteSettingsRoundRepository;
    protected $userDeviceTokenRepository;
    protected $mobileCountryCodeRepository;
    protected $circleDepositPaymentRepository;

    /**
     * CircleApiController constructor.
     *
     * @param ApiRepository $apiRepository
     * @param UserRepository $userRepository
     * @param CircleUserRepository $circleUserRepository
     * @param CircleRepository $circleRepository
     * @param SiteSettingsRepository $siteSettingsRepository
     * @param UserDeviceTokenRepository $userDeviceTokenRepository
     * @param MobileCountryCodeRepository $mobileCountryCodeRepository
     * @param CircleDepositPaymentRepository $circleDepositPaymentRepository
     */
    public function __construct(UserRepository $userRepository, CircleUserTempRepository $circleUserTempRepository, CircleRepository $circleRepository, CircleUserRepository $circleUserRepository, CircleRoundRepository $circleRoundRepository, SiteSettingsRepository $siteSettingsRepository, UserDeviceTokenRepository $userDeviceTokenRepository, MobileCountryCodeRepository $mobileCountryCodeRepository, CircleDepositPaymentRepository $circleDepositPaymentRepository)
    {
        $this->userRepository = $userRepository;
        $this->circleUserTempRepository = $circleUserTempRepository;
        $this->circleUserRepository = $circleUserRepository;
        $this->circleRepository = $circleRepository;
        $this->circleRoundRepository = $circleRoundRepository;
        $this->siteSettingsRepository = $siteSettingsRepository;
        $this->userDeviceTokenRepository = $userDeviceTokenRepository;
        $this->mobileCountryCodeRepository = $mobileCountryCodeRepository;
        $this->circleDepositPaymentRepository = $circleDepositPaymentRepository;
    }


    /**
     * Search by mobile number.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function searchByMobile(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        $mobile = isset($obj['mobile'])? $obj['mobile'] : '';
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization){
            if($mobile) {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($authorization);die;
                if($user_authorize){
                    $users = User::where('first_name','LIKE', '%'.$mobile.'%')
                                    ->orWhere('last_name','LIKE', '%'.$mobile.'%')
                                    ->orWhere('mobile_number','LIKE', '%'.$mobile.'%')
                                    ->orWhereRaw("CONCAT('first_name',' ','last_name') LIKE '%$mobile%'")
                                    ->get();
                    if(count($users)>0) {
                        $status = 100;
                        $statusCode = 200;
                        $message = 1020;
                        $output = $users;
                    } else {
                        $status = 300;
                        $statusCode = 401;
                        $message = 1022;
                    }
                } else {
                    $status = 300;
                    $statusCode = 401;
                    $message = 1001;
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1024;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1001;
        }
        
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);
    }

    /**
     * Create Circle User.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function create_circle_user(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        $user_info = $obj['user_info'];
        //echo '<pre>'; print_r($user_info); die;
        $circle_code = $obj['circle_code'];
        $flag = $obj['flag']; //1->site user, 2->contact list user
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);
        $instMe = '';
        $phoneBookUser = '';
        $already_assigened = [];
        $special_char_no = [];
        $inst = [];
        if($authorization){
            if($user_info && $circle_code && $flag) {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($user_authorize);die;
                if(count($user_authorize) > 0) {
                    if($flag==2){
                        $delete = $this->circleUserTempRepository->deleteByCondition(array('circle_code'=>$circle_code, 'flag'=>2));
                    }
                    $circlecount = $this->circleUserTempRepository->findCount(array('circle_code'=>$circle_code));
                    if($circlecount==0){//Insert me as a Circle user
                        $instArr = array(
                                            'user_id'=>$user_authorize[0]->id,
                                            'username'=>$user_authorize[0]->first_name.'(Admin)',
                                            'mobile_country_code'=>$user_authorize[0]->mobile_country_code,
                                            'mobile_number'=>$user_authorize[0]->mobile_number,
                                            'flag'=>0,
                                            'circle_code'=>$circle_code,
                                            'preference'=>0,
                                            'status_date'=>date('Y-m-d H:i:s')
                                        );
                        $instMe = $this->circleUserTempRepository->create($instArr);                        
                    }
                    if(count($user_info)>0){
                        $mobileCountryCodes = $this->mobileCountryCodeRepository->findByCondition();
                        foreach ($user_info as $key => $userinfo) {
                            /*if (preg_match('/[\'^£$%&*()}{@#~?><>,|=_¬-]/', $userinfo['mobile'])){
                                $special_char_no[] = $userinfo['mobile'];
                            } else {*/
                                $circlecount = $this->circleUserTempRepository->findCount(array('circle_code'=>$circle_code));
                                $mobile_country_code = '';
                                if (strpos($userinfo['mobile'], '+') !== false) {
                                    foreach ($mobileCountryCodes as $codekey => $code) {
                                        if (strstr($userinfo['mobile'], '+'.$code->phonecode) != "") {
                                            $mobile_country_code = '+'.$code->phonecode;
                                        }
                                        $userinfo['mobile'] = str_replace("+".$code->phonecode, "", $userinfo['mobile']);
                                    }
                                } elseif (substr($userinfo['mobile'], 0, 1) == 0) {
                                    $mobile_country_code = 0;
                                }
                                $circleusers = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code, 'mobile_number'=>$userinfo['mobile']));
                                //echo '<pre>'; print_r($circleusers);
                                $phoneBookUserExist = $this->userRepository->findByCondition(array('mobile_number'=>$userinfo['mobile']));
                                //echo '<pre>'; print_r($phoneBookUserExist);
                                $phoneBookUser = '';
                                $phoneBookUserCountryCode = '';
                                if($phoneBookUserExist->count()>0){
                                    $phoneBookUser = $phoneBookUserExist[0]->first_name.' '.$phoneBookUserExist[0]->last_name;
                                    $phoneBookUserCountryCode = $phoneBookUserExist[0]->mobile_country_code;
                                }
                                if($circleusers->count()==0) {
                                    if($mobile_country_code == 0){
                                        $mobile_country_code = 0;
                                    } elseif($mobile_country_code != ''){
                                        $mobile_country_code = $mobile_country_code;
                                    }  elseif($phoneBookUserCountryCode){
                                        $mobile_country_code = $phoneBookUserCountryCode;
                                    } 
                                    $instArrUsr = array(
                                                        'user_id'=>$user_authorize[0]->id,
                                                        'username'=> (($phoneBookUser != '') ? $phoneBookUser : $userinfo['username']),
                                                        'mobile_country_code'=>$mobile_country_code,
                                                        'mobile_number'=>(int) filter_var($userinfo['mobile'], FILTER_SANITIZE_NUMBER_INT),
                                                        'flag'=>$flag,
                                                        'circle_code'=>$circle_code,
                                                        'preference'=>$circlecount,
                                                    ); 
                                    //echo '<pre>'; print_r($instArrUsr);die;
                                    $inst = $this->circleUserTempRepository->create($instArrUsr);
                                } else {
                                    $already_assigened[] = $userinfo['mobile'];
                                }
                            //}
                            
                        }
                    }
                    $findAllUser = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code),'ASC');
                    if($findAllUser){
                        foreach ($findAllUser as $key => $value) {
                            $circle_user_details = $this->userRepository->findByCondition(array('mobile_number'=>$value->mobile_number));
                            $value->avatar_location = '';
                            if($circle_user_details->count()>0){
                                $value->avatar_location = $circle_user_details[0]->avatar_location;
                            }
                        }
                    }
                    if($already_assigened && $flag==1){
                        if(count($user_info) == count($already_assigened)){
                            $status = 300;
                            $statusCode = 404;
                            $message = 1021;
                        } else {
                            $status = 100;
                            $statusCode = 200;
                            $output = $findAllUser;
                            $message = 1025;
                            //$message = implode(',', $already_assigened)." already assigned to this Circle";
                        }
                    } elseif($special_char_no){
                        if(count($user_info) == count($special_char_no)){
                            $status = 300;
                            $statusCode = 404;
                            $message = implode(',', $special_char_no)." N'est pas un numéro de mobile valide et n'a donc pas pu être accepté";
                        } else {
                            $status = 100;
                            $statusCode = 200;
                            $output = $findAllUser;
                            $message = implode(',', $special_char_no)." N'est pas un numéro de mobile valide et n'a donc pas pu être accepté";
                        }
                    } elseif(!$inst){
                        $status = 100;
                        $statusCode = 200;
                        $message = 1026;
                    } else {
                        $status = 100;
                        $statusCode = 200;
                        $output = $findAllUser;
                        $message = 1025;
                    }
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = 1001;
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1024;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1001;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);        
        return response()->json($response);
    }

    /**
     * Delete Circle User.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function delete_circle_user(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        $mobile_number = $obj['mobile_number'];
        //echo '<pre>'; print_r($obj); die;
        $circle_code = $obj['circle_code'];
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);
        if($authorization){
            if($mobile_number && $circle_code) {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($authorization);die;
                if(count($user_authorize) > 0) {
                    $mobileCountryCodes = $this->mobileCountryCodeRepository->findByCondition();
                    $mobile_country_code = '';
                    if (strpos($mobile_number, '+') !== false) {
                        foreach ($mobileCountryCodes as $codekey => $code) {
                            $mobile_number = str_replace("+".$code->phonecode, "", $mobile_number);
                        }
                    } elseif (substr($mobile_number, 0, 1) == 0) {
                        $mobile_number = ltrim($mobile_number, '0'); 
                    }   
                    $delete = $this->circleUserTempRepository->deleteByCondition(array('circle_code'=>$circle_code,'mobile_number'=>$mobile_number));
                    $findAllUser = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code),'ASC');      
                    if($findAllUser){
                        foreach ($findAllUser as $key => $value) {
                            $circle_user_details = $this->userRepository->findByCondition(array('mobile_number'=>$value->mobile_number));
                            $value->avatar_location = '';
                            if($circle_user_details->count()>0){
                                $value->avatar_location = $circle_user_details[0]->avatar_location;
                            }
                        }
                    }              
                    $output = $findAllUser;
                    $status = 100;
                    $statusCode = 200;
                    $message = 1027;
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = 1001;
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1024;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1001;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);        
        return response()->json($response);
    }

    /**
     * Rearrange Circle User.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function rearrangeCircle_user(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        $reorder = explode(',', $obj['reorder']);
        $circle_code = $obj['circle_code'];
        $plist = explode(',', $obj['plist']);
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization){
            if($circle_code) {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($authorization);die;
                if(count($user_authorize) > 0) {
                    $finalOrderUsers = [];
                    if($obj['reorder']){
                        foreach ($plist as $key => $value) {
                            $findUser = $this->circleUserTempRepository->findByCondition(array('id'=>$value));
                            if($findUser->count()>0){
                                array_push($finalOrderUsers, $findUser[0]);
                            }
                        } 
                        if(count($finalOrderUsers)>0){
                            $this->circleUserTempRepository->deleteByCondition(array('circle_code'=>$circle_code));
                            foreach ($finalOrderUsers as $key => $value) {
                                $instArr = array(
                                                    'user_id'=>$value->user_id,
                                                    'username'=>$value->username,
                                                    'mobile_number'=>$value->mobile_number,
                                                    'mobile_country_code'=>$value->mobile_country_code,
                                                    'flag'=>$value->flag,
                                                    'circle_code'=>$value->circle_code,
                                                    'preference'=>$key,
                                                );
                                $inst = $this->circleUserTempRepository->create($instArr);
                            }
                        }
                    }
                    $findAllUser = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code),'ASC');  
                    if($findAllUser){
                        foreach ($findAllUser as $key => $value) {
                            $circle_user_details = $this->userRepository->findByCondition(array('mobile_number'=>$value->mobile_number));
                            $value->avatar_location = '';
                            if($circle_user_details->count()>0){
                                $value->avatar_location = $circle_user_details[0]->avatar_location;
                            }
                        }
                    }                  
                    $output = $findAllUser;
                    $status = 100;
                    $statusCode = 200;
                    $message = 1028;
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = 1001;
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1029;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1001;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);        
        return response()->json($response);
    }

    /**
     * Circle Details.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function circle_details(Request $request)
    {
        $response = array();
        $output = array();
        $output['pay_deposit'] = 0;
        $end_date = "";
        $estimate_round = "";
        $exceed_amount = "";

        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        $circle_code = $obj['circle_code'];
        $target_achive = $obj['target_achive'];
        $round_set = $obj['round_set'];
        $p_round = $obj['p_round'];
        $start_date = date('Y-m-d',strtotime(str_replace('/', '-', $obj['start_date'])));
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization){
            if($circle_code) {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($authorization);die;
                if(count($user_authorize) > 0) {
                    $findUser = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code),'ASC');
                    if(count($findUser) > 0){
                        $round = ceil($target_achive/$round_set);

                        if($p_round == 'weekly') {
                            $total = $round*7;
                        } elseif($p_round == 'bi-weekly') {
                            $total = $round*14;
                        } else if($p_round == 'monthly') {
                            $total = $round*30;
                        } else {
                            $total = $round*10;
                        }
                        $end_date = date('Y-m-d', strtotime($start_date. ' + '.$total.' days'));

                        $login_user_pref = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code, 'mobile_number'=>$user_authorize[0]->mobile_number),'ASC');
                        if(count($login_user_pref)>0){
                            $login_user_pref_data = $login_user_pref[0]->preference;
                            if(floor(count($findUser)/2) > $login_user_pref_data){
                                $output['pay_deposit'] = 1;
                            } else {
                                $output['pay_deposit'] = 0;
                            }
                        }
                        $status = 100;
                        $statusCode = 200;
                        $output = $findUser;
                        $end_date = date('d/m/Y',strtotime($end_date));
                        $estimate_round = ceil($round);

                        $exceed_amount = ($estimate_round*$round_set) - $target_achive;
                        $message = 1010;
                    } else {
                        $status = 300;
                        $statusCode = 404;
                        $message = 1030;
                    }
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = 1001;
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1031;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1001;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output, 'end_date'=>$end_date, 'estimate_round'=>$estimate_round, 'exceed_amount'=>$exceed_amount);        
        return response()->json($response);
    }

    /**
     * Create Circle.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function create_circle(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        $circle_code = $obj['circle_code'];
        $target_achive = $obj['target_achive'];
        $round_set = $obj['round_set'];
        $p_round = $obj['p_round'];
        $start_date = date('Y-m-d',strtotime(str_replace('/', '-', $obj['start_date'])));
        $reason_for_circle = $obj['reason_for_circle']?$obj['reason_for_circle']:'';
        $circle_title = isset($obj['circle_title']) ? $obj['circle_title'] : '';
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);
        $device_tokens = [];
        if($authorization){
            if($circle_code) {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                if(count($user_authorize) > 0) {
                    $findUser = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code));
                    //echo '<pre>';print_r($findUser);//die;
                    if(count($findUser) > 0){
                        foreach ($findUser as $key => $value) {
                            $instArr = array(
                                                'user_id'=>$value->user_id,
                                                'username'=>$value->username,
                                                'mobile_country_code' => $value->mobile_country_code,
                                                'mobile_number'=>$value->mobile_number,
                                                'circle_code'=>$value->circle_code,
                                                'preference'=>$value->preference,
                                                'accept_status'=>$value->accept_status,
                                                'status_date'=>$value->status_date,
                                                'other_reason'=>$value->other_reason,
                                                'reason_id'=>$value->reason_id,
                                                'created_at'=>$value->created_at,
                                                'updated_at'=>$value->updated_at,
                                            );
                            $inst = $this->circleUserRepository->create($instArr);
                            $this->circleUserRepository->updateByCondition(array('id'=>$inst->id), array('otp'=>$value->otp,'otp_validated_at'=>$value->otp_validated_at,'circle_title'=>$value->circle_title));
                            if($circle_title){
                                if($user_authorize[0]->mobile_number == $value->mobile_number){
                                    $this->circleUserRepository->updateByCondition(array('id'=>$inst->id), array('circle_title'=>$circle_title));
                                }
                            }
                            $deposit_payment_details_for_admin = $this->circleDepositPaymentRepository->findByCondition(array('circle_code'=>$value->circle_code, 'circle_user_id'=>$value->id));
                            if($deposit_payment_details_for_admin->count()>0){
                                $this->circleDepositPaymentRepository->updateByCondition(array('circle_code'=>$value->circle_code, 'circle_user_id'=>$value->id),array('circle_user_id'=>$inst->id));
                            }
                            $circleUserDetails = $this->userRepository->findByCondition(array('mobile_number'=>$value->mobile_number));
                            //echo '<pre>';echo $value->mobile_number; print_r($circleUserDetails);
                            if($user_authorize[0]->mobile_number != $value->mobile_number){
                                //--------------Send SMS-----------------//
                                //$sms_text = "Félicitations! Vous avez été invité à rejoindre le cercle créé sur l'application DANT par " .$user_authorize[0]->first_name." ".$user_authorize[0]->last_name. " N° tel: " .$user_authorize[0]->mobile_country_code.$user_authorize[0]->mobile_number. " Téléchargez DANT sur votre Play store et rejoignez ".$user_authorize[0]->first_name." ".$user_authorize[0]->last_name;

                                $sms_text = "Invitation à rejoindre un cercle par ".$user_authorize[0]->first_name." ".$user_authorize[0]->last_name." pour un montant de ".$target_achive." et un paiement régulier de ".$round_set." every ".$p_round;
                                $sms_number = $value->mobile_country_code.$value->mobile_number;
                                //echo $value->mobile_country_code.'='.$sms_number; die;
                                if($value->mobile_country_code == 0){
                                    $sms_number = "+33".$value->mobile_number;
                                } else {
                                    $sms_number = $value->mobile_country_code.$value->mobile_number;
                                }                                
                                $this->sendSMS($sms_text, $sms_number);
                            }
                            if($circleUserDetails->count()>0){
                                if($user_authorize[0]->mobile_number != $value->mobile_number){
                                    $userDevice = $this->userDeviceTokenRepository->findByCondition(array('user_id'=>$circleUserDetails[0]->id));
                                    if($userDevice->count()>0){
                                        //array_push($device_tokens, $userDevice[0]->device_tokens);
                                        $response = $this->siteSettingsRepository->notification($userDevice[0]->device_tokens, $circle_code);
                                        //echo 1;print_r($response);
                                    }
                                    /*************email********************/
                                    //$to = 'sayan@digitalaptech.com';
                                    $to = $circleUserDetails[0]->email;
                                    $email_text='   <tr>
                                                       <td style="padding: 20px 10px; font-family: sans-serif; font-size: 15px; mso-height-rule: exactly; line-height: 20px;color: #333; ">
                                                           <p>Cher <span style="">'.$circleUserDetails[0]->first_name.'</span> </p>
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                                           <p>Vous êtes invité à rejoindre un Cercle.</p>
                                                           <p>Veuillez trouver ci-dessous les informations du Cercle:</p>
                                                           
                                                           <p>Code du cercle: '.$value->circle_code.'</p>
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                                            <p>Restez connectés! Nous apprécions beaucoup la confiance que vous nous accordez</p>
                                                            <p>N\'hésitez pas à nous contacter pour toute information.</p>
                                                        </td>
                                                    </tr>';
                                            //echo $email_text; die;
                                    $data['email_text'] = $email_text;    
                                    Mail::send('mail.email_template', $data, function($message) use ($to)
                                    {
                                        $message->from(get_from_email(), 'DANT');
                                        $message->to($to);
                                        $message->subject('Invitation à rejoindre un Cercle');
                                    });
                                    /*************email********************/
                                }
                            }
                        }
                        $round = ceil($target_achive/$round_set);
                        if($p_round == 'weekly') {
                            $total = $round*7;
                        } elseif($p_round == 'bi-weekly') {
                            $total = $round*14;
                        } else if($p_round == 'monthly') {
                            $total = $round*30;
                        } else {
                            $total = $round*10;
                        }
                        $end_date = date('Y-m-d', strtotime($start_date. ' + '.$total.' days'));

                        $instCircleArr = array(
                                            'user_id'=>$user_authorize[0]->id,
                                            'circle_code'=>$circle_code,
                                            'target_achive'=>$target_achive,
                                            'round_set'=>$round_set,
                                            'p_round'=>$p_round,
                                            'reason_for_circle'=>$reason_for_circle,
                                            'start_date'=>$start_date,
                                            'no_of_member'=>count($findUser),
                                            'end_date'=>$end_date,
                                            'estimate_round' => ceil($round),
                                            'status'=>0
                                        );
                        $instCircle = $this->circleRepository->create($instCircleArr);
                        //$delete = $this->circleUserTempRepository->deleteByCondition(array('circle_code'=>$circle_code));

                        for($i=0; $i<ceil($round);$i++){
                            if($p_round == 'weekly') {
                                $payments_date = date('Y-m-d', strtotime($start_date. ' + '.($i*7).' days'));
                                $payments_grace_date = date('Y-m-d', strtotime($start_date. ' + '.(($i*7)+1).' days'));
                            } elseif($p_round == 'bi-weekly') {
                                $payments_date = date('Y-m-d', strtotime($start_date. ' + '.($i*14).' days'));
                                $payments_grace_date = date('Y-m-d', strtotime($start_date. ' + '.(($i*14)+2).' days'));
                            } else if($p_round == 'monthly') {
                                $payments_date = date('Y-m-d', strtotime($start_date. ' + '.($i*30).' days'));
                                $payments_grace_date = date('Y-m-d', strtotime($start_date. ' + '.(($i*30)+4).' days'));
                            } else {
                                $payments_date = date('Y-m-d', strtotime($start_date. ' + '.($i*10).' days'));
                                $payments_grace_date = date('Y-m-d', strtotime($start_date. ' + '.(($i*10)+1).' days'));
                            }
                            $instCircleArr = array(
                                                'circle_code'=>$circle_code,
                                                'round_no'=>$i+1,
                                                'payments_date'=>$payments_date,
                                                'payments_grace_date'=>$payments_grace_date
                                            );
                            $instCircleRound = $this->circleRoundRepository->create($instCircleArr);
                        }
                        
                        $status = 100;
                        $statusCode = 200;
                        $output = $instCircle;
                        $output['circle_users'] = $findUser;
                        $message = 1032;
                    } else {
                        $status = 300;
                        $statusCode = 404;
                        $message = 1030;
                    }
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = 1001;
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1031;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1001;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);        
        return response()->json($response);
    }

    /**
     * Circle terminate.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function circleTerminate(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);

        $circle_code = (isset($obj['circle_code']) ? $obj['circle_code'] : '');
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization){
            if($circle_code!='') {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($authorization);die;
                if(count($user_authorize) > 0) {
                    $update = $this->circleRepository->updateByCondition(array('circle_code'=>$circle_code),array('status'=>3));
                    $findUser = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code));
                    if(count($findUser) > 0){
                        foreach ($findUser as $key => $value) {
                            $circleUserDetails = $this->userRepository->findByCondition(array('mobile_number'=>$value->mobile_number));
                            if($circleUserDetails->count()>0){
                                if($user_authorize[0]->mobile_number != $value->mobile_number){
                                    $userDevice = $this->userDeviceTokenRepository->findByCondition(array('user_id'=>$circleUserDetails[0]->id));
                                    if($userDevice->count()>0){
                                        //array_push($device_tokens, $userDevice[0]->device_tokens);
                                        $content = array(
                                            "en" => 'DANT Circle '.$circle_code.' Terminé par l\'administrateur'
                                        );
                                        $response = $this->siteSettingsRepository->notification($userDevice[0]->device_tokens, $circle_code, $content);
                                        //echo 1;print_r($response);
                                    }
                                    /*************email********************/
                                    //$to = 'sayan@digitalaptech.com';
                                    $to = $circleUserDetails[0]->email;
                                    $email_text='   <tr>
                                                       <td style="padding: 20px 10px; font-family: sans-serif; font-size: 15px; mso-height-rule: exactly; line-height: 20px;color: #333; ">
                                                           <p>Cher <span style="">'.$circleUserDetails[0]->first_name.'</span> </p>
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                                           <p>Circle Terminé par l\'administrateur.</p>
                                                           <p>Please find the follwing circle details:</p>
                                                           
                                                           <p>Code du cercle: '.$value->circle_code.'</p>
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                                            <p>Restez connectés! Nous apprécions beaucoup la confiance que vous nous accordez</p>
                                                            <p>N\'hésitez pas à nous contacter pour toute information.</p>
                                                        </td>
                                                    </tr>';
                                            //echo $email_text; die;
                                    $data['email_text'] = $email_text;    
                                    Mail::send('mail.email_template', $data, function($message) use ($to)
                                    {
                                        $message->from(get_from_email(), 'DANT');
                                        $message->to($to);
                                        $message->subject('Cercle de résiliation du courrier');
                                    });
                                    /*************email********************/
                                }
                            }
                        }
                    }
                    $status = 100;
                    $statusCode = 200;
                    $message = 1033;
                } else {
                    $status = 300;
                    $statusCode = 401;
                    $message = 1001;
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1034;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1001;
        }
        
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);
    }

    /**
     * Circle report.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function circleReport(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);

        $circle_code = (isset($obj['circle_code']) ? $obj['circle_code'] : '');
        $user_type = (isset($obj['user_type']) ? $obj['user_type'] : ''); // 1->Admin, 2->user
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization){
            if($circle_code!='') {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($authorization);die;
                if(count($user_authorize) > 0) {
                    /*************email********************/
                        $to = get_admin_email();
                        $email_text='   <tr>
                                           <td style="padding: 20px 10px; font-family: sans-serif; font-size: 15px; mso-height-rule: exactly; line-height: 20px;color: #333; ">
                                               <p>Cher Admin, </p>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                               <p>Demande d\'un rapport de fin de Cercle.</p>
                                               
                                               <p>Code du cercle: '.$circle_code.'</p>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                                <p>Restez connectés! Nous apprécions beaucoup la confiance que vous nous accordez</p>
                                                <p>N\'hésitez pas à nous contacter pour toute information.</p>
                                            </td>
                                        </tr>';
                                //echo $email_text; die;
                        $data['email_text'] = $email_text;    
                        Mail::send('mail.email_template', $data, function($message) use ($to)
                        {
                            $message->from(get_from_email(), 'DANT');
                            $message->to($to);
                            $message->subject('Rapport de Cercle');
                        });
                    /*************email********************/
                    $status = 100;
                    $statusCode = 200;
                    $message = 1035;
                } else {
                    $status = 300;
                    $statusCode = 401;
                    $message = 1001;
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = 1034;
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1001;
        }
        
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);
    }

    /**
     * Circle create otp send.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function circleOtpSend(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        //print_r($obj);die();
        $flag = $obj['flag']; // 1->circle create/join, 2->edit profile, 3->mobile change ;
        $circle_code = isset($obj['circle_code']) ? $obj['circle_code'] : 0;
        $user_id = isset($obj['user_id']) ? $obj['user_id'] : 0;
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($flag && $authorization) {
            $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
            //print_r($user_authorize);die;
            if(count($user_authorize) > 0) {
                /************Send OTP*****************/
                $otp = "";
                $codeAlphabet = "0123456789";
                for($i=0;$i<4;$i++){
                    $otp .= $codeAlphabet[mt_rand(0,strlen($codeAlphabet)-1)];
                }
                if($flag == 1){
                    $this->circleUserTempRepository->updateByCondition(array('circle_code'=>$circle_code,'mobile_number'=>$user_authorize[0]->mobile_number),array('otp'=>$otp));
                    $otp_number = $user_authorize[0]->mobile_country_code.$user_authorize[0]->mobile_number;
                } elseif($flag == 2){
                    $this->userRepository->updateByCondition(array('mobile_number'=>$user_authorize[0]->mobile_number),array('edit_otp'=>$otp));
                    $otp_number = $user_authorize[0]->mobile_country_code.$user_authorize[0]->mobile_number;
                } elseif($flag == 3){
                    $this->userRepository->updateByCondition(array('mobile_number'=>$user_authorize[0]->mobile_number),array('mobile_change_otp'=>$otp));
                    $otp_number = $user_authorize[0]->mobile_country_code.$user_authorize[0]->new_number;
                }                
                
                $sent = $this->sendSMS($otp, $otp_number);
                /************Send OTP*****************/

                if($sent) {
                    $status = 100;
                    $statusCode = 200;
                    $message = 1010;
                } else {
                    $status = 300;
                    $statusCode = 402;
                    $message = 1008;
                }
            } else {
                $status = 300;
                $statusCode = 401;
                $message = 1001;
            }
            
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1012;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        return response()->json($response);
    }

    /**
     * Circle create otp validation.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function circleOtpValidation(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        //print_r($obj);die();
        $flag = $obj['flag']; // 1->circle create/join, 2->edit profile, 3->mobile change ;
        $otp = $obj['otp'];
        $circle_code = isset($obj['circle_code']) ? $obj['circle_code'] : 0;
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);
        $output['pay_deposit'] = 0;

        if($flag && $otp && $authorization) {
            $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
            //print_r($user_authorize);die;
            if(count($user_authorize) > 0) {
                if($flag == 1){
                    $check_temp_user = $this->circleUserTempRepository->findByCondition(array('otp'=>$otp,'mobile_number'=>$user_authorize[0]->mobile_number));      
                    $check_user = $this->circleUserRepository->findByCondition(array('otp'=>$otp,'mobile_number'=>$user_authorize[0]->mobile_number));        
                    if(count($check_temp_user) > 0 || count($check_user) > 0) {
                        $update_arr = [
                            'otp'   => '',
                            'otp_validated_at' => date('Y-m-d H:i:s')
                        ];
                        $updated = $this->circleUserTempRepository->updateByCondition(array('otp'=>$otp,'mobile_number'=>$user_authorize[0]->mobile_number), $update_arr);
                        $updated_user = $this->circleUserRepository->updateByCondition(array('otp'=>$otp,'mobile_number'=>$user_authorize[0]->mobile_number), $update_arr);
                        if($updated || $updated_user) {
                            $findUser = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code));
                            $login_user_pref = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code, 'mobile_number'=>$user_authorize[0]->mobile_number),'ASC');
                            if(count($login_user_pref)>0){
                                $login_user_pref_data = $login_user_pref[0]->preference;
                                if(floor(count($findUser)/2) > $login_user_pref_data){
                                    $output['pay_deposit'] = 1;
                                } else {
                                    $output['pay_deposit'] = 0;
                                }
                            }
                            $status = 100;
                            $statusCode = 200;
                            $message = 1010;
                        } else {
                            $status = 300;
                            $statusCode = 402;
                            $message = 1008;
                        }
                    } else {
                        $status = 300;
                        $statusCode = 401;
                        $message = 1011;
                    }
                } elseif($flag == 2){
                    $check_user = $this->userRepository->findByCondition(array('edit_otp'=>$otp,'mobile_number'=>$user_authorize[0]->mobile_number));        
                    if(count($check_user) > 0) {
                        $update_arr = [
                                'edit_otp'   => ''
                            ];
                        $updated = $this->userRepository->updateByCondition(array('edit_otp'=>$otp,'mobile_number'=>$user_authorize[0]->mobile_number), $update_arr);
                        $status = 100;
                        $statusCode = 200;
                        $message = 1010;
                    } else {
                        $status = 300;
                        $statusCode = 402;
                        $message = 1008;
                    }

                } elseif($flag == 3){
                    $check_user = $this->userRepository->findByCondition(array('mobile_change_otp'=>$otp,'mobile_number'=>$user_authorize[0]->mobile_number));        
                    if(count($check_user) > 0) {
                        $update_arr = [
                                'mobile_change_otp'   => ''
                            ];
                        $updated = $this->userRepository->updateByCondition(array('mobile_change_otp'=>$otp,'mobile_number'=>$user_authorize[0]->mobile_number), $update_arr);
                        if($user_authorize[0]->old_number_first == 0 || $user_authorize[0]->old_number_second != 0){
                            $updated = $this->userRepository->updateByCondition(array('id'=>$user_authorize[0]->id), array('old_number_first'=>$user_authorize[0]->mobile_number, 'mobile_number'=>$user_authorize[0]->new_number));
                            $updated = $this->circleUserTempRepository->updateByCondition(array('mobile_number'=>$user_authorize[0]->mobile_number), array('mobile_number'=>$user_authorize[0]->new_number));
                            $updated = $this->circleUserRepository->updateByCondition(array('mobile_number'=>$user_authorize[0]->mobile_number), array('mobile_number'=>$user_authorize[0]->new_number));
                        } elseif($user_authorize[0]->old_number_second == 0){
                            $updated = $this->userRepository->updateByCondition(array('id'=>$user_authorize[0]->id), array('old_number_second'=>$user_authorize[0]->mobile_number, 'mobile_number'=>$user_authorize[0]->new_number));
                            $updated = $this->circleUserTempRepository->updateByCondition(array('mobile_number'=>$user_authorize[0]->mobile_number), array('mobile_number'=>$user_authorize[0]->new_number));
                            $updated = $this->circleUserRepository->updateByCondition(array('mobile_number'=>$user_authorize[0]->mobile_number), array('mobile_number'=>$user_authorize[0]->new_number));
                        }
                        $status = 100;
                        $statusCode = 200;
                        $message = 1010;
                    } else {
                        $status = 300;
                        $statusCode = 402;
                        $message = 1008;
                    }
                }  
            } else {
                $status = 300;
                $statusCode = 401;
                $message = 1001;
            }
            
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1012;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        return response()->json($response);
    }

    /**
     * Circle title add for specific user.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function circleTitleAdd(Request $request)
    {
        $response = array();
        $output = array();
        $json = file_get_contents('php://input');
        $obj = json_decode($json, TRUE);
        //print_r($obj);die();
        $circle_code = $obj['circle_code'];
        $circle_title = $obj['circle_title'];
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($circle_code && $circle_title && $authorization) {
            $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
            //print_r($user_authorize);die;
            if(count($user_authorize) > 0) {
                $check_user = $this->circleUserRepository->findByCondition(array('circle_code'=>$circle_code,'mobile_number'=>$user_authorize[0]->mobile_number));        
                if(count($check_user) > 0) {
                    $update_arr = [
                        'circle_title'   => $circle_title
                    ];
                    $updated_user = $this->circleUserRepository->updateByCondition(array('circle_code'=>$circle_code,'mobile_number'=>$user_authorize[0]->mobile_number), $update_arr);
                    if($updated_user) {
                        $status = 100;
                        $statusCode = 200;
                        $message = 1010;
                    } else {
                        $status = 300;
                        $statusCode = 402;
                        $message = 1008;
                    }
                } else {
                    $status = 300;
                    $statusCode = 401;
                    $message = 1011;
                }
            } else {
                $status = 300;
                $statusCode = 401;
                $message = 1001;
            }
            
        } else {
            $status = 300;
            $statusCode = 404;
            $message = 1012;
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        return response()->json($response);
    }

    public function test_admin_email(){
        //echo 'hi'; die;
        echo get_admin_email(); die;
    }

      /**
     * Send SMS.
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function sendSMS($text="", $number = 0) {
        $sms_gateway_email_details = $this->siteSettingsRepository->findByCondition(array('keyword'=>'sms_gateway_email'));
        $sms_gateway_email = '';
        if($sms_gateway_email_details->count()>0){
            $sms_gateway_email = $sms_gateway_email_details[0]->value;
        }
        $sms_gateway_api_key_details = $this->siteSettingsRepository->findByCondition(array('keyword'=>'sms_gateway_api_key'));
        $sms_gateway_api_key = '';
        if($sms_gateway_api_key_details->count()>0){
            $sms_gateway_api_key = $sms_gateway_api_key_details[0]->value;
        }
        try {
            
            $url = "https://www.octopush-dm.com/api/sms/?user_login=".$sms_gateway_email."&api_key=".$sms_gateway_api_key."&sms_text=".urlencode($text."\n STOP au XXXXX")."&sms_recipients=+".$number."&sms_type=FR&sms_sender=Dant&sms_mode=11&transactional=1";
            $curl = curl_init($url);
            curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//raw output
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
            $result = curl_exec($curl);
            $message = simplexml_load_string($result);
            //print_r($message);die;
            return true;
        } catch (\Exception $e) {
            return 0;
        }
    }
}
