<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use App\Repository\AdminRepository;
use Illuminate\Http\Request;
use App\Models\Auth\User;
use App\Models\Auth\Currency;
use App\Models\Auth\Language;
use App\Models\CircleUser;
use App\Models\CircleUserTemp;
use App\Models\CircleRoundPayment;
use App\Models\Circle;
use App\Models\SiteSettings;
use App\Models\MobileCountryCode;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Auth;
use Image;
use File;
// use DB;

class AdminDashboardController extends Controller {

    // protected $dart_email;

    public function __construct(AdminRepository $AdminRepository)
    {

        $this->dart_email = $AdminRepository->email_to();
        
    }

    function index() 
    {
        // //waiting circle
        // $waiting = Circle::where('status', 0)->whereHas('getUsers', function ($query) {
        //             $query->where('accept_status', 0);
        //     })->get();
        // dd($waiting);
        


        //Reject Circle
        // $reject = Circle::where('status', 0)->whereHas('getUsers', function ($query) {
        //             $query->where('accept_status', 2);
        //     })->get();
        $reject = Circle::where('status', 4)->get();


        //waiting circle
        // $circle = Circle::where('status', 0)->get();
        // $waiting = count($circle)-count($reject); 
        $waiting = Circle::where('status', 0)->get();
        // dd($waiting);

        //ongoing circle
        $ongoing = Circle::where('status', 1)->whereRaw('estimate_round-completed_round > 0')->get();
        // dd($ongoing);
        
        //block circle
        $block = Circle::where('status', 2)->get();

        //suspend circle
        $suspend = Circle::where('status', 3)->get();

        //complete circle
        $complete = Circle::where('status', 5)->whereRaw('estimate_round-completed_round = 0')->get();

        // dd($complete);


        //latest circle
        $latest = Circle::orderBy('created_at', 'desc')->limit(5)->get();
        foreach ($latest as $key => $value) {
            $payment = CircleRoundPayment::where('circle_code', $value->circle_code)->where('payment_type', 2)->get();
            $count = count($payment);
            $latest[$key]->count = $count;
            $circleUser = CircleUser::where('circle_code', $value->circle_code)->where('accept_status', 2)->get();
            $usercount = count($circleUser);
            $latest[$key]->usercount = $usercount;
            
        }
        
        //latest user
        $user = User::where(['role_id'=>2, 'status'=>1, 'confirmed'=>1])->orderBy('created_at', 'desc')->limit(5)->get();


        // dd($user);
        return view('admin.pages.dashboard.index', compact('waiting', 'ongoing', 'block', 'suspend', 'latest', 'user', 'complete', 'reject'));
    }

    function userDetails() 
    {
        // $table = new User;
        // $where = array('role_id' => 2);
        // $user = $AdminRepository->getAllByWhere($table, $where);
        $user = User::select('users.*')
                     ->where('role_id', 2)
                     // ->where('status', 1)
                     ->where('confirmed', 1)
                     ->orderBy('first_name', 'asc')
                     ->get();
        
        // $dart_email = $AdminRepository->email_to();
        // dd($this->dart_email[4]['value']);
        return view('admin.pages.client.list', compact('user'));
    }


    public function status(AdminRepository $AdminRepository, $id)
    {
        $user_id = base64_decode($id);
        $table = new User;
        $count;


        $userData = $AdminRepository->getById($user_id, $table);
        
        // dd($userData);

        $userActive = $userData->status;

        $circleUser = CircleUser::where('mobile_number', $userData->mobile_number)->get();

        $count = count($circleUser);

        if($count>0)
        {
            foreach ($circleUser as $key => $value) 
            {
                $circle = Circle::where(['circle_code'=> $value->circle_code, 'status'=>0])->orWhere(['circle_code'=> $value->circle_code, 'status'=>1])->orWhere(['circle_code'=> $value->circle_code, 'status'=>2])->get();

                $count = count($circle);

            }
        }
        else
        {
            $count == 0;
        }

        // dd($circleUser);

        if($userActive == 1 && $count == 0)
        {
            /*************email********************/
                $to = $userData->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="">'.$userData->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.user_profile_inactive_by_admin_mail_body_para1').'</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($this->dart_email[4]['value'], 'DANT');
                    $message->to($to);
                    $message->subject(__('messages.user_profile_inactive_by_admin_mail_subject'));
                });
                /*************email********************/

            $data = array('status' => 0);    
            $status = $AdminRepository->update($data, $user_id, false, $table);            
        }
        elseif ($userActive == 1 && $count>0) 
        {
            session()->flash('errors', 'Sorry, User is already assigned a circle which is waiting or ongoing or blocked; Please Try Again');
            return redirect()->route('admin.userList');
        }
        else
        {
            /*************email********************/
                $to = $userData->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="">'.$userData->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.user_profile_active_by_admin_mail_body_para1').'</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($this->dart_email[4]['value'], 'DANT');
                    $message->to($to);
                    $message->subject(__('messages.user_profile_active_by_admin_mail_subject'));
                });
                /*************email********************/
            $data = array('status' => 1); 
            $status = $AdminRepository->update($data, $user_id, false, $table);                
        }

        
        
        if($status)
        {
            session()->flash('success', 'User Status Changed Successfully');
            return redirect()->route('admin.userList');
        }
        else
        {
            session()->flash('errors', 'Sorry, But User Status Was Not Changed Successfully; Please Try Again');
            return redirect()->route('admin.userList');
        }
                   
    }

    public function document_validate(AdminRepository $AdminRepository, $id)
    {
        $user_id = base64_decode($id);
        $table = new User;
        $data = array('document_validated' => 1); 
        $status = $AdminRepository->update($data, $user_id, false, $table);   
        if($status)
        {
            session()->flash('success', 'User Validated Successfully');
            return redirect()->route('admin.userList');
        }
        else
        {
            session()->flash('errors', 'Sorry, But User Not Validated Successfully; Please Try Again');
            return redirect()->route('admin.userList');
        }
                   
    }    

    function profile(AdminRepository $AdminRepository) {
        $table = new User;
        $where = array('role_id'=>1);
        $data = $AdminRepository->getByWhere($table, $where);
        return view('admin.pages.profile', compact('data'));
    }


    function profileUpdate(AdminRepository $AdminRepository, Request $request, $id) {

        $table = new User;
        $updId = base64_decode($id);
        if($request->input('pword')=='')
        {
            $data = array('first_name'=> $request->input('fname'), 'last_name'=> $request->input('lname'));
        }
        else
        {
            $data = array(
                'first_name'  => $request->input('fname'),
                'last_name'   => $request->input('lname'),
                'password'    => Hash::make($request->input('pword'))
                );
        }
        $update = $AdminRepository->update($data, $updId, false, $table);
        
        if($update)
        {
            session()->flash('success', 'Your Update Was Succesfully Made');
            return redirect()->route('admin.profile');
        }
        else
        {
            session()->flash('errors', 'Your Update Was Not Succesfully Made');
            return redirect()->route('admin.profile');
        }
    }


    public function profileImageUpdate(AdminRepository $AdminRepository, Request $request, $id)
    {
        $table = new User;
        $imgId = base64_decode($id);

        $lastImg = $table::find($imgId);

        $request->validate([
            'profilepic'          => 'required'
        ]);

        //Main Image Insert 
        if(!empty($request->profilepic))
        {
         //Delete Old Images
            
            if(File::exists('storage/'.$lastImg->avatar_location))
            {
                File::delete('storage/'.$lastImg->avatar_location);
            }

         //Insert New Image
         $image = $request->file('profilepic');
         //Create Image Name
         $img = 'profile.'.$image->getClientOriginalExtension(); 
         $location = public_path('storage/avatars/'.$img);
         
         Image::make($image->getRealPath())->resize(400, 400)->save($location);
        }

        $data = array('avatar_location' => 'avatars/'.$img);
        $return = $AdminRepository->update($data, $imgId, false, $table);

        if($return)
        {
            session()->flash('success', ' Your Update Was Succesfully Made');
            return redirect()->route('admin.profile');
        }
        else
        {
            session()->flash('errors', 'Your Update Was Not Succesfully Made');
            return redirect()->route('admin.profile');
        }
    }

    
    public function add(AdminRepository $AdminRepository)
    {
        $code = MobileCountryCode::all();
        return view('admin.pages.client.add', compact('code'));
    }


    public function store(AdminRepository $AdminRepository, Request $request)
    {
        $table = new User;

        $emailwhere = array('email' => $request->input('email'));
        $email = $AdminRepository->getByWhere($table, $emailwhere);

        $phonewhere = array('mobile_number'=>$request->input('contact_no'));
        $phone = $AdminRepository->getByWhere($table, $phonewhere);

        if($email)
        {
            session()->flash('errors', 'Your Insert Email Id Already Exist');
            return redirect()->route('admin.user');
        }
        else if($phone)
        {
            session()->flash('errors', 'Your Insert Contact Number Already Exist');
            return redirect()->route('admin.user');
        }
        else
        {
            $profile_pic = '';
            $scan_pic = '';
            try {
                if($request->input('mainpic')){
                    $image = $request->input('mainpic');
                    $dataimage = $image;
                    $image_array_1 = explode(";", $dataimage);
                    $image_array_2 = explode(",", $image_array_1[1]);
                    $dataimage = base64_decode($image_array_2[1]);
                    //Create Image Name
                    $profile_pic = time().str_random(5).'.png'; 
                    $location = public_path().'/storage/avatars/' . $profile_pic;
                    Image::make(file_get_contents($image))->resize(260, 260)->save($location);
                }
                if($request->file('scan_pic')){
                    if(in_array($request->file('scan_pic')->getClientOriginalExtension(), ['jpg', 'jpeg', 'png'])){
                        $scan_pic = time().str_random(5).'.'.$request->file('scan_pic')->getClientOriginalExtension();
                        $upload_location = $request->file('scan_pic')->storeAs('/id_scan', $scan_pic, 'public');
                    }
                }
            } catch(\Exception $e) {

            }
            $data = array(
            'first_name'          => $request->input('fname'),
            'last_name'           => $request->input('lname'),
            'mobile_country_code' => '+'.$request->input('contact_code'),
            'mobile_number'       => $request->input('contact_no'),
            'email'               => $request->input('email'),
            'password'            => Hash::make($request->input('pword')),
            'remember_token'      => md5(uniqid(mt_rand(), true)),
            'dob'                 => $request->input('dob'),
            'iban'                => $request->input('FRI'),
            'credit_card_no'      => $request->input('card_no'),
            'paypal_account'      => $request->input('paypal_acc'),
            'avatar_location'     => $profile_pic,
            'id_scan'             => $scan_pic,
            'status'              => 1,
            'confirmed'           => 1
            );

            $user_id = $AdminRepository->create($data, $table);

            /*************email********************/
                $to = $request->input('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="">'.$request->input('fname').'</span> </p>
                                    </td>
                                </tr>
                                <tr>
                                    <td style="font-family: sans-serif; color: #333; padding: 0px 10px 40px; font-size: 16px; line-height: 30px;">
                                       <p>Admin create a new account in Dant, Follow Your Credential<br>Username is: '.$request->input('email').'<br> and Password is: '.$request->input('pword').'.</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($this->dart_email[4]['value'], 'DANT');
                    $message->to($to);
                    $message->subject('Dart Registration Successfully');
                });
                /*************email********************/


            session()->flash('success', ' New User Created Succesfully ');
            return redirect()->route('admin.userList');

        }
    }


    public function edit(AdminRepository $AdminRepository, Request $request, $id)
    {
        $updid = base64_decode($id);
        $table = new User;

        $user = $AdminRepository->getById($updid, $table);
        $code = MobileCountryCode::all();
        $contact_code = explode('+', $user->mobile_country_code);
        if(count($contact_code)>1)
        {
            $code_only = $contact_code[1];
        }
        else
        {
            $code_only = $contact_code[0];
        }
        
        // dd($contact_code);
        return view('admin.pages.client.edit', compact('user', 'code', 'code_only'));
    }


    public function update(Request $request, AdminRepository $AdminRepository, $id)
    {
        $user_id = base64_decode($id);
        $table = new User;

        $user = $AdminRepository->getById($user_id, $table);
        $email = User::where('email',  $request->input('editemail'))->where('id', '!=', $user_id)->first();

        $phone = User::where('mobile_number',  $request->input('editcontact_no'))->where('id', '!=', $user_id)->first();
        $phoneOldFirst = User::where('old_number_first',  $request->input('editcontact_no'))->where('id', '!=', $user_id)->first();
        $phoneOldSecond = User::where('old_number_second',  $request->input('editcontact_no'))->where('id', '!=', $user_id)->first();
        if($email)
        {
            session()->flash('errors', 'Your Insert Email Id Already Exist');
            return redirect()->route('admin.cliEdit', $id);
        }
        else if($phone || $phoneOldFirst || $phoneOldSecond)
        {
            session()->flash('errors', 'Your Insert Contact Number Already Exist');
            return redirect()->route('admin.cliEdit', $id);
        }
        else
        {
            $profile_pic = '';
            $scan_pic = '';            
            $data = array(
            'first_name'     => $request->input('fname'),
            'last_name'      => $request->input('lname'),
            'mobile_number'  => $request->input('editcontact_no'),
            'email'          => $request->input('editemail'),
            'dob'            => $request->input('dob'),
            'iban'           => $request->input('FRI'),
            'credit_card_no' => $request->input('card_no'),
            'paypal_account' => $request->input('paypal_acc')
            );
            if($request->input('editpword') != '') {
                $data['password'] = Hash::make($request->input('editpword'));
            }
            try {
                if($request->input('mainpic')){
                    $image = $request->input('mainpic');
                    $dataimage = $image;
                    $image_array_1 = explode(";", $dataimage);
                    $image_array_2 = explode(",", $image_array_1[1]);
                    $dataimage = base64_decode($image_array_2[1]);
                    //Create Image Name
                    $profile_pic = time().str_random(5).'.png'; 
                    $location = public_path().'/storage/avatars/' . $profile_pic;
                    Image::make(file_get_contents($image))->resize(260, 260)->save($location);
                    $data['avatar_location'] = 'avatars/'.$profile_pic;
                    if(File::exists('storage/'.$user->avatar_location))
                    {
                        File::delete('storage/'.$user->avatar_location);
                    }
                }
                if($request->file('scan_pic')){
                    if(in_array($request->file('scan_pic')->getClientOriginalExtension(), ['jpg', 'jpeg', 'png'])){
                        $scan_pic = time().str_random(5).'.'.$request->file('scan_pic')->getClientOriginalExtension();
                        $upload_location = $request->file('scan_pic')->storeAs('/id_scan', $scan_pic, 'public');
                        $data['id_scan'] = $scan_pic;
                        if(File::exists('storage/'.$user->id_scan))
                        {
                            File::delete('storage/'.$user->id_scan);
                        }
                    }
                }
            } catch(\Exception $e) {

            }
            if($request->input('editcontact_no')) {
                if($user->mobile_number != $request->input('editcontact_no')) {
                    if($user->old_number_first == '') {
                        User::where('id', $user_id)->update(['old_number_first'=>$user->mobile_number]);
                    }
                    if($user->old_number_second == '') {
                        User::where('id', $user_id)->update(['old_number_second'=>$user->mobile_number]);
                    }
                    CircleUserTemp::where('mobile_number', $user->mobile_number)->update(['mobile_number'=>$request->input('editcontact_no')]);
                    CircleUser::where('mobile_number', $user->mobile_number)->update(['mobile_number'=>$request->input('editcontact_no')]);
                }
            }
            $update = $AdminRepository->update($data, $user_id, false, $table);
            if($update)
            {
                /*************email********************/
                    $to = $request->input('editemail');
                    $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="">'.$request->input('fname').'</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.user_profile_updated_by_admin_mail_body_para1').'</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($this->dart_email[4]['value'], 'DANT');
                        $message->to($to);
                        $message->subject(__('messages.user_profile_updated_by_admin_mail_subject'));
                    });
                    /*************email********************/

                session()->flash('success', ' User Update Was Succesfully Made ');
                return redirect()->route('admin.userList');
            }
            else
            {
                session()->flash('errors', ' Sorry, But User Was Not Update Successfully; Please Try Again');
                return redirect()->route('admin.cliUpdate', $id);
            }
        }
    }

    public function currency(AdminRepository $AdminRepository)
    {
        $table = new Currency;
        $curr = $AdminRepository->getAll($table);

        return view('admin.pages.currency.list', compact('curr'));
    }


    public function Language(AdminRepository $AdminRepository)
    {
        $table = new Language;
        $lang = $AdminRepository->getAll($table);

        return view('admin.pages.language.list', compact('lang'));
    }


    public function site_settings(AdminRepository $AdminRepository)
    {
        $table = new SiteSettings;
        $setting = $AdminRepository->getAll($table);

        return view('admin.pages.site.list', compact('setting'));
    }


    public function site_settings_edit(AdminRepository $AdminRepository, $id)
    {
        $settings_id = base64_decode($id);
        $setting = SiteSettings::find($settings_id);

        $explode = explode('_', $setting->keyword);
        $concate = '';
        foreach ($explode as $key => $value) {
            $concate .= ucfirst($value).' ';
        }
        
        return view('admin.pages.site.edit', compact('setting', 'concate'));
    }


    public function site_settings_update(AdminRepository $AdminRepository, $id, Request $request)
    {
        $settings_id = base64_decode($id);
        $table = new SiteSettings;

        $data = array('value' => $request->input('site_value'));

        $setting = $AdminRepository->update($data, $settings_id, false, $table);
        
        if($setting)
        {
            session()->flash('success', ' Site Settings Update Was Succesfully Made ');
            return redirect()->route('admin.sitesettingList');
        }
        else
        {
            session()->flash('errors', ' Sorry, But Site Settings Was Not Update Successfully; Please Try Again');
            return redirect()->route('admin.sitesettingEdit', $id);
        }
    }


    public function particularUserDetails(AdminRepository $AdminRepository, $id)
    {
        $id = base64_decode($id);

        $user = User::find($id);

        // dd($user);

        return view('admin.pages.client.userDetails', compact('user'));
    }


    // public function email_domain_blacklist(AdminRepository $AdminRepository)
    // {
        
    // }

}
