<?php

namespace App\Http\Controllers\Api;

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;

/**
 * Class CircleApiController.
 */
class CircleApiController extends Controller
{
    /**
     * @var UserRepository
     * @var CircleUserTempRepository
     * @var CircleUserRepository
     * @var CircleRepository
     * @var CircleRoundRepository
     */
    protected $userRepository;
    protected $circleUserTempRepository;
    protected $circleUserRepository;
    protected $circleRepository;
    protected $circleRoundRepository;

    /**
     * CircleApiController constructor.
     *
     * @param ApiRepository $apiRepository
     * @param UserRepository $userRepository
     * @param CircleUserRepository $circleUserRepository
     * @param CircleRepository $circleRepository
     */
    public function __construct(UserRepository $userRepository, CircleUserTempRepository $circleUserTempRepository, CircleRepository $circleRepository, CircleUserRepository $circleUserRepository, CircleRoundRepository $circleRoundRepository)
    {
        $this->userRepository = $userRepository;
        $this->circleUserTempRepository = $circleUserTempRepository;
        $this->circleUserRepository = $circleUserRepository;
        $this->circleRepository = $circleRepository;
        $this->circleRoundRepository = $circleRoundRepository;
    }


    /**
     * 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 = $obj['mobile'];
        $circle_code = $obj['circle_code'];
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);

        if($authorization){
            if($mobile && $circle_code) {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($authorization);die;
                if(count($user_authorize) > 0) {
                    if($user_authorize[0]->mobile_number != $mobile){
                        $users = $this->userRepository->findByCondition(array('mobile_number'=>$mobile, 'confirmed'=>1));
                        if(count($users)>0) {
                            $circleusers = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code, 'mobile_number'=>$mobile));
                            //echo '<pre>'; print_r($users);die;
                            if(count($circleusers)==0) {
                                $users[0]['key'] = $users[0]->id;
                                $status = 100;
                                $statusCode = 200;
                                $message = 'User found';
                                $output = $users[0];
                            } else {
                                $status = 300;
                                $statusCode = 401;
                                $message = "Already assigned to this Circle";
                            }
                        } else {
                            $status = 300;
                            $statusCode = 401;
                            $message = "Non registered number";
                        }
                    } else {
                        $status = 300;
                        $statusCode = 401;
                        $message = "You can't add your own number";
                    }
                } else {
                    $status = 300;
                    $statusCode = 401;
                    $message = "Unauthenticated user";
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = "Please fill a number";
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = "Authorization required";
        }
        
        $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);
        $username = $obj['username'];
        $mobile = $obj['mobile'];
        $circle_code = $obj['circle_code'];
        $authorization = explode('Bearer ', $request->header('Authorization'));
        $authorization = end($authorization);
        $instMe = '';
        if($authorization){
            if($username && $mobile && $circle_code) {
                $user_authorize = $this->userRepository->findByCondition(array('remember_token'=>$authorization));
                //print_r($authorization);die;
                if(count($user_authorize) > 0) {

                    $circleusers = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code, 'mobile_number'=>$mobile));
                    //echo '<pre>'; print_r($users);die;
                    if(count($circleusers)==0) {
                        $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_number'=>$user_authorize[0]->mobile_number,
                                                'circle_code'=>$obj['circle_code'],
                                                'preference'=>0,
                                            );
                            $instMe = $this->circleUserTempRepository->create($instArr);
                        }
                        $instArr = array(
                                            'user_id'=>$user_authorize[0]->id,
                                            'username'=>$obj['username'],
                                            'mobile_number'=>$obj['mobile'],
                                            'circle_code'=>$obj['circle_code'],
                                            'preference'=>(($instMe) ? 1: $circlecount),
                                        );
                        $inst = $this->circleUserTempRepository->create($instArr);
                        $status = 100;
                        $statusCode = 200;
                        $output = $inst;
                        $message = 'User assigned successful';
                    } else {
                        $status = 300;
                        $statusCode = 401;
                        $message = "Already assigned to this Circle";
                    }
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = "Unauthenticated user";
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = "Please fill a number";
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = "Authorization required";
        }
        $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));
                            array_push($finalOrderUsers, $findUser[0]);
                            //$findUser = $this->circleUserTempRepository->updateByCondition(array('id'=>$value, 'circle_code'=>$circle_code),array('preference'=>$reorder[$key]));
                        } 
                        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,
                                                    'circle_code'=>$value->circle_code,
                                                    'preference'=>$key,
                                                );
                                $inst = $this->circleUserTempRepository->create($instArr);
                            }
                        }
                    }
                    $findAllUser = $this->circleUserTempRepository->findByCondition(array('circle_code'=>$circle_code),'ASC');
                    $output = $findAllUser;
                    $status = 100;
                    $statusCode = 200;
                    $message = 'User reorder successful';
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = "Unauthenticated user";
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = "Please send a order";
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = "Authorization required";
        }
        $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();
        $end_date = "";
        $estimate_round = "";

        $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){
                        /*$total_rev = $target_achive;
                        $per_person_rev = $round_set;
                        $total_person = count($findUser);
                        $total_person_rev = $per_person_rev * $total_person;
                        $rev = $total_rev/$total_person_rev;
                        $round1 = round($rev);
                        if($rev>$round1) {
                            $round = $round1+1;
                        } else {
                            $round = $round1;
                        }*/
                        $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'));


                        $status = 100;
                        $statusCode = 200;
                        $output = $findUser;
                        $end_date = date('d/m/Y',strtotime($end_date));
                        $estimate_round = ceil($round);
                        $message = 'Successful';
                    } else {
                        $status = 300;
                        $statusCode = 404;
                        $message = "Please assign a user first";
                    }
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = "Unauthenticated user";
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = "Please add circle code properly";
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = "Authorization required";
        }
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output, 'end_date'=>$end_date, 'estimate_round'=>$estimate_round);        
        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']:'';
        $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));
                    if(count($findUser) > 0){
                        foreach ($findUser as $key => $value) {
                            $instArr = array(
                                                'user_id'=>$value->user_id,
                                                'username'=>$value->username,
                                                'mobile_number'=>$value->mobile_number,
                                                'circle_code'=>$value->circle_code,
                                                'preference'=>$value->preference,
                                                'accept_status'=>$value->accept_status,
                                                'status_date'=>$value->status_date,
                                                'created_at'=>$value->created_at,
                                                'updated_at'=>$value->updated_at,
                                            );
                            $inst = $this->circleUserRepository->create($instArr);
                        }
                        /*$total_rev = $target_achive;
                        $per_person_rev = $round_set;
                        $total_person = count($findUser);
                        $total_person_rev = $per_person_rev * $total_person;
                        $rev = $total_rev/$total_person_rev;
                        $round1 = round($rev);
                        if($rev>$round1) {
                            $round = $round1+1;
                        } else {
                            $round = $round1;
                        }*/

                        $round = ceil($target_achive/$round_set);

                        // echo ($round);die;
                        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
                                            );
                            $instCircle = $this->circleRoundRepository->create($instCircleArr);
                        }

                        $status = 100;
                        $statusCode = 200;
                        $output = $instCircle;
                        $output['circle_users'] = $findUser;
                        $message = 'Circle created successful';
                    } else {
                        $status = 300;
                        $statusCode = 404;
                        $message = "Please assign a user first";
                    }
                } else {
                    $status = 300;
                    $statusCode = 404;
                    $message = "Unauthenticated user";
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = "Please add circle properly";
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = "Authorization required";
        }
        $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));
                    $status = 100;
                    $statusCode = 200;
                    $message = 'Circle terminated successfully';
                } else {
                    $status = 300;
                    $statusCode = 401;
                    $message = "Unauthenticated user";
                }
            } else {
                $status = 300;
                $statusCode = 404;
                $message = "Please send circle code";
            }
        } else {
            $status = 300;
            $statusCode = 404;
            $message = "Authorization required";
        }
        
        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);
    }
}
