<?php

namespace App\Http\Controllers\Cron;

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\CircleUserRepository;
use App\Repositories\CircleRoundRepository;
use App\Repositories\CircleRoundPaymentRepository;
use Illuminate\Support\Facades\Mail;
use App\Repositories\CurrencyRepository;
use App\Models\Circle;
use App\Models\DefaultedUser;
use App\Repositories\SiteSettingsRepository;
use App\Repositories\Auth\UserDeviceTokenRepository;

/**
 * Class CronController.
 */
class CronController extends Controller
{
    /**
     * @var UserRepository
     * @var CircleUserRepository
     * @var CircleRepository
     * @var CircleRoundRepository
     * @var CircleRoundPaymentRepository
     * @var CurrencyRepository
     * @var SiteSettingsRepository
     * @var UserDeviceTokenRepository
     */
    protected $userRepository;
    protected $circleUserRepository;
    protected $circleRepository;
    protected $circleRoundRepository;
    protected $circleRoundPaymentRepository;
    protected $currencyRepository;
    protected $siteSettingsRoundRepository;
    protected $siteSettingsRepository;
    protected $userDeviceTokenRepository;

    /**
     * CronController constructor.
     *
     * @param ApiRepository $apiRepository
     * @param UserRepository $userRepository
     * @param CircleUserRepository $circleUserRepository
     * @param CircleRepository $circleRepository
     * @param CircleRoundPaymentRepository $circleRoundPaymentRepository
     * @param CurrencyRepository $currencyRepository
     * @param SiteSettingsRepository $siteSettingsRepository
     * @param UserDeviceTokenRepository $userDeviceTokenRepository
     */
    public function __construct(UserRepository $userRepository, CircleRepository $circleRepository, CircleUserRepository $circleUserRepository, CircleRoundRepository $circleRoundRepository, CircleRoundPaymentRepository $circleRoundPaymentRepository, CurrencyRepository $currencyRepository, SiteSettingsRepository $siteSettingsRepository, UserDeviceTokenRepository $userDeviceTokenRepository)
    {
        $this->userRepository = $userRepository;
        $this->circleUserRepository = $circleUserRepository;
        $this->circleRepository = $circleRepository;
        $this->circleRoundRepository = $circleRoundRepository;
        $this->circleRoundPaymentRepository = $circleRoundPaymentRepository;
        $this->currencyRepository = $currencyRepository;
        $this->siteSettingsRepository = $siteSettingsRepository;
        $this->userDeviceTokenRepository = $userDeviceTokenRepository;
    }


    /**
     * Circle status update on start date
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function circleStartStatus(Request $request)
    {
        Mail::raw('circleStartStatus running', function ($message) {
            $message->to('testdevloper007@gmail.com');
        });
        $current_date = date('Y-m-d');
       // $current_date = date('2019-09-11');
        $start_date = date('Y-m-d', strtotime($current_date . ' -1 day'));
        $circles = $this->circleRepository->findByCondition(array('start_date'=>$start_date,'status'=>0));
        if($circles){
            foreach ($circles as $key => $value) {
                $circleUsers = $this->circleUserRepository->findByCondition(array('circle_code'=>$value->circle_code, 'accept_status'=>0));
                //dd($value);;die;
                if($circleUsers->count()>0){
                    $this->circleRepository->updateByCondition(array('circle_code'=>$value->circle_code), array('status'=>0));
                } else {
                    $this->circleRepository->updateByCondition(array('circle_code'=>$value->circle_code), array('status'=>1));
                }
            }    
        }
        echo $start_date.' Successfull';
    }

    /**
     * Circle round payment status update before payment grace date
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function roundPaymentStatusBeforeGraceDate(Request $request)
    {
        Mail::raw('roundPaymentStatusBeforeGraceDate running', function ($message) {
            $message->to('testdevloper007@gmail.com');
        });
        //$current_date = '2020-06-09';
        $current_date = date('Y-m-d');
        $grace_date = date('Y-m-d', strtotime($current_date . ' -1 day'));
        $rounds = $this->circleRoundRepository->findByCondition(array('payments_grace_date'=>$grace_date,'payment_status'=>0));
        //dd($rounds);       
        if($rounds){
            foreach ($rounds as $key => $value) {
                $circle = $this->circleRepository->findByCondition(array('circle_code'=>$value->circle_code));
                
                if(count($circle)>0){
                    $paidUsers = $this->circleRoundPaymentRepository->findByCondition(array('circle_code'=>$value->circle_code, 'round_id'=>$value->id, 'trn_status'=>1,'payment_type'=>1));
                    //echo count($paidUsers).'=='.$circle[0]->no_of_member;die;
                    if(count($paidUsers)==$circle[0]->no_of_member){
                        $this->circleRepository->updateByCondition(array('circle_code'=>$value->circle_code), array('completed_round'=>$value->round_no,'status'=>1));
                        $this->circleRoundRepository->updateByCondition(array('id'=>$value->id), array('payment_status'=>1));
                    } else {
                        if($circle[0]->status < 2) {
                            $this->circleRepository->updateByCondition(array('circle_code'=>$value->circle_code), array('status'=>2));
                            $circleUsers = $this->circleUserRepository->findByCondition(array('circle_code'=>$value->circle_code));
                            if(count($circleUsers)>0){
                                foreach ($circleUsers as $key => $users) {
                                    $unpaidUser = $this->circleRoundPaymentRepository->findByCondition(array('circle_code'=>$value->circle_code, 'round_id'=>$value->id, 'trn_status'=>1,'payment_type'=>1, 'circle_user_id'=>$users->id));
                                    if(count($unpaidUser) == 0){
                                        $exist = DefaultedUser::where(['circle_user_id'=>$users->id, 'circle_code'=>$value->circle_code,'round_no'=>$value->round_no])->first();
                                        if(!$exist){
                                            DefaultedUser::create(['circle_user_id'=>$users->id, 'circle_code'=>$value->circle_code,'username'=>$users->username,'mobile_country_code'=>$users->mobile_country_code,'mobile'=>$users->mobile_number,'defaulted_date'=>$grace_date,'round_no'=>$value->round_no]);
                                        }
                                    }
                                }
                            }

                            /************************Send notification*********************/
                            if(count($circleUsers)>0){
                                foreach ($circleUsers as $userkey => $userval) {
                                    $userDetails = $this->userRepository->findByCondition(array('mobile_number'=>$userval->mobile_number));
                                    if(count($userDetails)>0){
                                        /*************email********************/
                                        //$to = 'sayan@digitalaptech.com';
                                        $to = $userDetails[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>'.__('messages.all_mail_before_name').' <span style="">'.$userDetails[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>'.__('messages.circle_blocked_mail_body_para1').'</p>
                                                               
                                                               <p>'.__('messages.circle_blocked_mail_body_para2').' '.$circle[0]->circle_code.'</p>
                                                               <p>'.__('messages.circle_blocked_mail_body_para3').' '.($circle[0]->completed_round+1).'</p>
                                                            </td>
                                                        </tr>
                                                        <tr>
                                                            <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                                               <p>'.__('messages.all_mail_footer_para2').'</p>
                                                                <p>'.__('messages.all_mail_footer_para3').'</p>
                                                            </td>
                                                        </tr>';
                                                //echo $email_text; die;
                                        $data['email_text'] = $email_text;    
                                        Mail::send('mail.email_template', $data, function($message) use ($to)
                                        {
                                            $message->from('testdevloper007@gmail.com', 'DANT');
                                            $message->to($to);
                                            $message->subject(__('messages.circle_blocked_mail_subject'));
                                        });
                                        /*************email********************/
                                        /******************Push notification*********************/
                                        $userDevice = $this->userDeviceTokenRepository->findByCondition(array('user_id'=>$userDetails[0]->id));
                                        if(count($userDevice)>0){
                                            $content = array(
                                                "en" => __('messages.circle_blocked_notification').' '.$circle[0]->circle_code
                                            );
                                            $notify_response = $this->siteSettingsRepository->notification($userDevice[0]->device_tokens, $circle[0]->circle_code, $content);
                                        }
                                        /******************Push notification*********************/
                                    }
                                }
                            }
                            /********************************Send notification*********************/
                        }
                    }
                }
            }    
        }
        echo $grace_date.' Successfull';
    }

    /**
     * Circle round payment reminder
     *
     * @param Json ApiRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws GeneralException
     */
    public function roundPaymentReminder(Request $request)
    {
        Mail::raw('roundPaymentReminder running', function ($message) {
            $message->to('testdevloper007@gmail.com');
        });

        $current_date = date('Y-m-d');
        //$current_date = '2019-09-25';
        $rounds = $this->circleRoundRepository->findByCondition(array('payments_date'=>$current_date,'payment_status'=>0));
        $curreny = $this->currencyRepository->findByCondition(array('status'=>1));
        if($rounds){
            foreach ($rounds as $key => $value) {
                $circle_users = $this->circleUserRepository->findByCondition(array('circle_code'=>$value->circle_code));
                $circle_details = $this->circleRepository->findByCondition(array('circle_code'=>$value->circle_code));
                if(count($circle_user)>0){
                    foreach ($circle_users as $userkey => $userval) {
                        $paidUsers = $this->circleRoundPaymentRepository->findByCondition(array('circle_code'=>$value->circle_code, 'round_id'=>$value->id, 'circle_user_id'=>$userval->id,'payment_type'=>1));
                        //echo '--'.$paidUsers->count().'=';
                        if(count($paidUsers)==0){
                            $userDetails = $this->userRepository->findByCondition(array('mobile_number'=>$userval->mobile_number));
                            if(count($userDetails)>0){
                                /*************email********************/
                                //$to = 'sayan@digitalaptech.com';
                                $to = $userDetails[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>'.__('messages.all_mail_before_name').' <span style="">'.$userDetails[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>'.__('messages.round_payment_remainder_mail_body_para1').'</p>
                                                       <p>'.__('messages.round_payment_remainder_mail_body_para2').'</p>
                                                       
                                                       <p>'.__('messages.round_payment_remainder_mail_body_para3').' '.$value->circle_code.'</p>
                                                       <p>'.__('messages.round_payment_remainder_mail_body_para4').' '.$value->round_no.'</p>
                                                       <p>'.__('messages.round_payment_remainder_mail_body_para5').' '.$value->payments_date.'</p>
                                                       <p>'.__('messages.round_payment_remainder_mail_body_para6').' '.$curreny->curr_code.' '.$circle_details[0]->round_set.'</p>
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                                       <p>'.__('messages.all_mail_footer_para2').'</p>
                                                        <p>'.__('messages.all_mail_footer_para3').'</p>
                                                    </td>
                                                </tr>';
                                        //echo $email_text; die;
                                $data['email_text'] = $email_text;    
                                Mail::send('mail.email_template', $data, function($message) use ($to)
                                {
                                    $message->from('testdevloper007@gmail.com', 'DANT');
                                    $message->to($to);
                                    $message->subject(__('messages.round_payment_remainder_mail_subject'));
                                });
                                /*************email********************/
                            }
                        }
                    }
                }
            }    
        }
        echo $current_date.' Successfull';
    }


    public function circleSuspend(Request $request)
    {
        Mail::raw('circleSuspend running', function ($message) {
            $message->to('testdevloper007@gmail.com');
        });
        
        $current_date = date('Y-m-d');
        $grace_date = date('Y-m-d', strtotime($current_date . ' -1 day'));
        $rounds = $this->circleRoundRepository->findByCondition(array('payments_grace_date'=>$grace_date,'payment_status'=>0));
        $g_date = "";
        //dd($rounds);
        if($rounds){
            // dd($rounds);
            foreach ($rounds as $key => $value) {
                $circle = $this->circleRepository->findByCondition(array('circle_code'=>$value->circle_code));
                // dd($circle);

                foreach ($circle as $key => $val) {
                    if($val->p_round =='weekly')
                    {
                        $g_date = date('Y-m-d', strtotime($current_date . ' -8 day'));
                    }
                    elseif($val->p_round =='bi-weekly')
                    {
                        $g_date = date('Y-m-d', strtotime($current_date . ' -15 day'));
                    }
                    elseif($val->p_round =='monthly')
                    {
                        $g_date = date('Y-m-d', strtotime($current_date . ' -31 day'));
                    }
                    else
                    {
                        $g_date = date('Y-m-d', strtotime($current_date . ' -11 day'));
                    }

                    // dd($g_date);

                    $ter_rounds = $this->circleRoundRepository->findByCondition(array('payments_grace_date'=>$g_date,'payment_status'=>0));

                    //dd($ter_rounds);

                    if($ter_rounds)
                    {
                        foreach ($ter_rounds as $key => $val1) 
                        {
                            $ter_circle = $this->circleRepository->findByCondition(array('circle_code'=>$val1->circle_code, 'status'=>2));
                            if(count($ter_circle)>0)
                            {
                                if($ter_circle[0]->status < 3) {
                                    $this->circleRepository->updateByCondition(array('circle_code'=>$val1->circle_code), array('status'=>3));
                                    /************************Send notification*********************/
                                    $circleUsers = $this->circleUserRepository->findByCondition(array('circle_code'=>$ter_circle[0]->circle_code));
                                    if(count($circleUsers)>0){
                                        foreach ($circleUsers as $userkey => $userval) {
                                            $userDetails = $this->userRepository->findByCondition(array('mobile_number'=>$userval->mobile_number));
                                            if(count($userDetails)>0){
                                                /*************email********************/
                                                //$to = 'sayan@digitalaptech.com';
                                                $to = $userDetails[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>'.__('messages.all_mail_before_name').' <span style="">'.$userDetails[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>'.__('messages.circle_suspended_mail_body_para1').'</p>
                                                                       
                                                                       <p>'.__('messages.circle_suspended_mail_body_para2').' '.$ter_circle[0]->circle_code.'</p>
                                                                       <p>'.__('messages.circle_suspended_mail_body_para3').' '.($ter_circle[0]->completed_round+1).'</p>
                                                                    </td>
                                                                </tr>
                                                                <tr>
                                                                    <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                                                       <p>'.__('messages.all_mail_footer_para2').'</p>
                                                                        <p>'.__('messages.all_mail_footer_para3').'</p>
                                                                    </td>
                                                                </tr>';
                                                        //echo $email_text; die;
                                                $data['email_text'] = $email_text;    
                                                Mail::send('mail.email_template', $data, function($message) use ($to)
                                                {
                                                    $message->from('testdevloper007@gmail.com', 'DANT');
                                                    $message->to($to);
                                                    $message->subject(__('messages.circle_suspended_mail_subject'));
                                                });
                                                /*************email********************/
                                                /******************Push notification*********************/
                                                $userDevice = $this->userDeviceTokenRepository->findByCondition(array('user_id'=>$userDetails[0]->id));
                                                if(count($userDevice)>0){
                                                    $content = array(
                                                        "en" => __('messages.circle_suspended_notification').' '.$ter_circle[0]->circle_code
                                                    );
                                                    $notify_response = $this->siteSettingsRepository->notification($userDevice[0]->device_tokens, $ter_circle[0]->circle_code, $content);
                                                }
                                                /******************Push notification*********************/
                                            }
                                        }
                                    }
                                    /********************************Send notification*********************/
                                }
                            } 
                        }
                    }  
                }
            }    
        }
        
        echo $g_date.'suspend Successfull';
    }
}
