<?php

/** @noinspection ALL */
/** @noinspection DuplicatedCode */

/** @noinspection PhpUndefinedClassInspection */

namespace App\Http\Controllers\Client;

use App\AdminAccessRight;
use App\Company;
use App\CompanyDirector;
use App\CompanyStatus;
use App\Role;
use App\Tools\SmsTools;
use App\User;
use App\UserSenderId;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use App\Mail\PasswordRest;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use App\Services\OTPService;

class CompanyController extends Controller
{
    public function __construct() {}

    public function create(Request $request)
    {

        if ($request->isMethod('Post')) {

            $request->validate(
                [
                    'name' => 'required|unique:companies',
                    'mobile_money_number' => 'nullable|digits_between:10,20',
                    'company_phone_number' => 'nullable|digits_between:10,20',
                    'contact_person' => 'required',
                    'contact_person_phone' => 'required|unique:companies|digits_between:10,20',
                    //'contact_person_email' => 'required|email|unique:companies',
                    //'contact_person_email' => 'required|email|unique:users,email',
                    'username' => 'required|min:6|unique:users',
                    'contact_person_email' => 'required|email',
                ]
            );

            // Validate phone number has verified OTP for registration
            $otpService = new OTPService();
            $phoneValidation = $otpService->validatePhoneForRegistration($request->input('contact_person_phone'), 10);

            if (!$phoneValidation['valid']) {
                return redirect()->back()
                    ->withInput(Input::all())
                    ->withErrors(['contact_person_phone' => $phoneValidation['message'] ?? 'Phone number not verified']);
            }


            try {

                //                    $contains = Str::contains($request->input('contact_person_email'), ['@']);
                //
                //                    if (!$contains)
                //                        return redirect()->back()->withInput(Input::all())->withErrors('This is not a valid email');

                //                    $verify = User::query()->where('email', $request->input('contact_person_email'))->first();
                //
                //                    if ($verify)
                //                        return redirect()->back()->withInput(Input::all())->withErrors('the email ' . $request->input('contact_person_email') . ' has already been taken');

                $records = $request->all();
                $records['nature_of_business'] = empty($request->input('nature_of_business')) ? 'N/A' : $request->input('nature_of_business');
                $records['company_phone_number'] = empty($request->input('company_phone_number')) ? 'N/A' : $request->input('company_phone_number');
                $records['contact_person_phone'] = SmsTools::format_gh_number($request->input('contact_person_phone'));
                $records['date_of_incorporation'] = empty($request->input('date_of_incorporation')) ? 'N/A' : $request->input('date_of_incorporation');
                $records['location_in_other_countries'] = empty($request->input('location_in_other_countries')) ? 'N/A' : $request->input('location_in_other_countries');
                $records['physical_address'] = empty($request->input('physical_address')) ? 'N/A' : $request->input('physical_address');
                $records['postal_address'] = empty($request->input('postal_address')) ? 'N/A' : $request->input('postal_address');
                //$records['paid_initial_debit'] = false;
                $records['mobile_money_number'] = empty($request->input('mobile_money_number')) ? 'N/A' : $request->input('mobile_money_number');

                $result = $this->generateUserInfo($request);
                $result['created_by'] = 'npontu';

                DB::beginTransaction();

                $user = User::query()->create($result);

                if ($user) :

                    $records['user_id'] = $user->id;

                    $user->credit()->create([
                        'username' => $user->username,
                        'price' => '0.028',
                        'email_price' => '0.00332',
                        'credit_alloted' => '0.00',
                        'old_bal' => '0',
                        'new_bal' => '0.00',
                        'credit_used' => '0',
                        'credited' => '0'
                    ]);  // create the user details for the company or individual
                    $output = $this->saveFiles($request); // save files
                    $company = Company::query()->create($records);  //create the company
                    $company->putToTrialMode($records); //put to trial mode
                    $company->update($output); // update company records with the files captured


                    $balance = $user->credit->price * 3;
                    $user->credit->update(['new_bal' => $balance, 'credited' => $balance]);


                    if ($company) :

                        $user->update(['company_id' => $company->id]);    //update user table with company table

                        if (isset($sendor_ids))
                            $this->saveSenderId($sendor_ids, $user);          //then we save the sender Id here

                        if (isset($directors))
                            $this->saveDirectors($directors, $company);       //we save the company's director here

                        $status = $this->setStatus($company);  //sets the company to approved

                        $company->update($status);  //updates the company status to approved


                        $data['email'] = $user->email;
                        $data['name'] = $user->full_name;
                        $data['c_username'] = $user->username;
                        //$data['registered_under'] = $user->created_by;
                        $data['c_password'] = $user->pass;
                        $data['url'] = route($result['url']);
                        $data['content'] = "Your account for Deywuro has been created and registered under {$user->created_by} with username and password";


                        try {
                            Mail::send('emails.admin_login', $data, function ($m) use ($data) {
                                $m->from('sms@deywuro.com', 'Deywuro');
                                $m->to($data['email'], $data['name']);
                                $m->subject('Company Registration');
                            });
                        } catch (\Exception $e) {
                        }


                        try {
                            Mail::send('emails.admin_login', ['company' => $company], function ($m) {
                                $m->from('sms@deywuro.com', 'Deywuro');
                                $m->to('support@npontu.com');
                                $m->subject('New Company Registration');
                            });
                        } catch (\Exception $ex) {
                        }


                        $msg = "Hello {$company->name},\n\n" .
                            "Your account for Deywuro has been created.\n" .
                            "Username: {$company->users->username}\n" .
                            "Password: {$company->users->pass}\n" .
                            "Registered under: {$company->users->created_by}\n" .
                            "URL: {$data['url']}\n\n" .
                            "Thank you,\nDeywuro";

                        $this->sendSms($msg, $company->users->phone_number);

                    endif;
                endif;

                DB::commit();

                $flash = "Hello {$company->name}, thank you for registering for the Deywuro. Account details have been sent via mail and sms Thank you.";
                return redirect()->route($result['url'])->with('success', $flash);
            } catch (\Exception $exception) {
                $this->appLog('SINGUP ERROR ||' . $exception->getMessage() . '||' . $exception->getFile());
                return redirect()->back()->withInput(Input::all())->withErrors('Signup Failed Kindly Try again');
            }
        }
    }


    public function  edit(Request $request, $id)
    {
        $company = Company::query()->find($id);
        $sends = json_encode(UserSenderId::query()->where('user_id', $company->users->id)->select('id', 'sender_id as name')->get()->toArray());
        $dirs = json_encode($company->directors()->select('id', 'name', 'designation')->get()->toArray());

        if ($request->isMethod('Post')) :

            $this->validate($request, [
                'name' => 'required|unique:companies,name,' . $id,
                //                'date_of_incorporation' =>'required',
                //                'legal_status' =>'required',
                'mobile_money_number'        => 'sometimes|nullable|digits_between:10,20',
                'company_phone_number'       => 'required|digits_between:10,20',
                'contact_person'             => 'required',
                'contact_person_designation' => 'required',
                'contact_person_phone'       => 'required|digits_between:10,20',
                'contact_person_email'       => 'required',
            ]);


            $contains = Str::contains($request->input('contact_person_email'), ['@']);

            if (!$contains)
                return redirect()->back()->withInput(Input::all())->withErrors('This is not a valid email');

            $verify = User::query()->where('email', $request->input('contact_person_email'))->first();

            if ($verify && $company->users->email != $verify->email)
                return redirect()->back()->withInput(Input::all())->withErrors('the email ' . $request->input('contact_person_email') . ' has already been taken');

            $records = $request->all();

            //            $sender_ids  = json_decode($records['sender_ids'], true);
            //
            //            $directors   = json_decode($records['items'], true);
            //
            //            if($sender_ids == null  || $directors == null)
            //                redirect()->back()->withErrors('All Fields Are Required');

            /** Validation check on company directors **/
            if (count($directors) < 1)
                return redirect()->back()
                    ->withInput(Input::all())
                    ->withErrors('Company directors field should have a Minimum of one director');


            $records['date_of_incorperation']       = empty($request->input('date_of_incorperation')) ? 'N/A' : $request->input('date_of_incorperation');
            $records['nature_of_business']          = empty($request->input('nature_of_business')) ? 'N/A' : $request->input('nature_of_business');
            $records['location_in_other_countries'] = empty($request->input('location_in_other_countries')) ? 'N/A' : $request->input('location_in_other_countries');
            $records['physical_address']            = empty($request->input('physical_address')) ? 'N/A' : $request->input('physical_address');
            $records['postal_address']              = empty($request->input('postal_address')) ? 'N/A' : $request->input('postal_address');

            $result = $this->editUserInfo($request);


            DB::beginTransaction();

            if (!empty($company->users))
                $user   = $company->users->update($result);

            $company->update($records);

            //update uploaded files
            $output = $this->editSavedFiles($request, $company);
            if (!empty($output))
                $company->update($output);
            //then we edit the sender Id here
            //            if (!empty($user))
            //                $this->editSavedSenderId($sender_ids);
            // we edit the company's director here
            //            $this->editSavedDirectors($directors);

            DB::commit();

            return redirect()->route('admin.root.company')->with('success', 'Company Successfully Updated');

        endif;

        return view('admin.root.edit', compact('company', 'sends', 'dirs'));
    }

    private function verifyUsername($string)
    {
        $length = 2;
        $query = User::query()->where('username', $string)->first();
        //if query returns true that means we ought to regenerate the user the name.

        //while $query remains true
        while ($query) :
            $random = substr(str_shuffle(str_repeat($x = '0123456789', ceil($length / strlen($x)))), 1, $length);
            $string = $string . $random;
            break;
        endwhile;

        return $string;
    }
    private function generateUserInfo(Request $request)
    {
        $inputs['phone_number'] = SmsTools::format_gh_number($request->input('contact_person_phone'));
        $inputs['full_name'] = $request->input('name');
        $words = explode(" ", trim($request->input('name')));
        $acronym = "";
        foreach ($words as $w) {
            if ($w && isset($w[0]) && !empty($w[0]))
                $acronym .= $w[0];
        }

        $demo = strtolower($acronym . $words[0]);
        $password = substr(hash('sha512', rand()), 0, 6);
        $username =  $this->verifyUsername($demo);

        $inputs['username'] = $request->input('username');
        $inputs['first_name'] = $words[0];
        $inputs['organisation'] = $request->input('name');;
        $inputs['email'] = $request->input('contact_person_email');
        $inputs['role_id'] = Role::where('name', $request->input('register_as'))->first()->id;
        $inputs['password'] = bcrypt($password);
        $inputs['website_url'] = !empty($request->input('website_url')) ? $request->input('website_url') : null;
        $inputs['status'] = 'active';
        $inputs['must_change_password'] = true;
        $inputs['location'] = empty($request->input('physical_address')) ? 'N/A' : $request->input('physical_address');
        $inputs['pass'] = $password;

        if ($inputs['role_id'] == 2) {
            $inputs['url']  = 'login';
        } else if ($inputs['role_id'] == 3) {
            $inputs['url']  = 'reseller.login';
        }

        return $inputs;
    }
    private function saveFiles(Request $request)
    {
        $records = array();

        $currentTimestamp = date('Y-m-d_H-i-s');

        if ($request->hasFile('business_document')) {
            $bc = $request->file('business_document');
            $records['business_document'] = $currentTimestamp . '_' . $bc->getClientOriginalName();
            $bc->storePubliclyAs('public/business_doc', $records['business_document']);
        }

        if ($request->hasFile('business_logo')) {
            $logo = $request->file('business_logo');
            $records['business_logo'] = $currentTimestamp . '_' . $logo->getClientOriginalName();
            $logo->storePubliclyAs('public/business_logo', $records['business_logo']);
        }

        if ($request->hasFile('sender_id_document')) {
            $sendID = $request->file('sender_id_document');
            $records['sender_id_document'] = $currentTimestamp . '_' . $sendID->getClientOriginalName();
            $sendID->storePubliclyAs('public/sender_docs', $records['sender_id_document']);
        }

        if ($request->hasFile('contact_person_id')) {
            $contactID = $request->file('contact_person_id');
            $records['contact_person_id'] = $currentTimestamp . '_' . $contactID->getClientOriginalName();
            $contactID->storePubliclyAs('public/contact_person', $records['contact_person_id']);
        }

        return $records;
    }

    private function saveSenderId($senderIds, $user)
    {
        if (is_array($senderIds))
            foreach ($senderIds as $sendor_id) :

                $today = Carbon::parse(now());
                $registerIds = new UserSenderId;
                $registerIds->user_id = $user->id;
                $registerIds->sender_id = $sendor_id['Name'];
                $registerIds->created_at = $today;
                $registerIds->updated_at = $today;
                $registerIds->save();

            endforeach;
    }
    private function saveDirectors($directors, $company)
    {
        foreach ($directors as $director) :
            $array['company_id'] = $company->id;
            $array['name'] = $director['Name'];
            $array['designation'] = $director['Designation'];
            CompanyDirector::query()->create($array);

        endforeach;
    }

    private function setStatus($company, $_status = 1)
    {

        $status['company_id'] = $company->id;
        $status['r_code'] = $this->returnCode(4);
        $status['status'] = $_status;
        $save = CompanyStatus::query()->create($status);
        //create a new array and send results
        $expose['company_status_id'] = $save->id;
        $expose['code'] = $status['r_code'];

        return $expose;
    }

    private function returnCode($length)
    {
        $t = Carbon::parse(now())->format('s');
        $random = substr(str_shuffle(str_repeat($x = '0123456789', ceil($length / strlen($x)))), 1, $length);
        return 'DY' . $random . $t;
    }

    private function editUserInfo(Request $request)
    {
        $inputs['phone_number'] = SmsTools::format_gh_number($request->input('company_phone_number'));
        $inputs['full_name'] = $request->input('name');

        $inputs['organisation'] = $request->input('name');;
        $inputs['email']        = $request->input('contact_person_email');
        $inputs['website_url']  = !empty($request->input('website_url')) ? $request->input('website_url') : null;
        $inputs['role_id']      = Role::where('name', $request->input('register_as'))->first()->id;
        $inputs['location']     = empty($request->input('physical_address')) ? 'N/A' : $request->input('physical_address');;

        return $inputs;
    }

    private function editSavedFiles(Request $request, $company)
    {
        $records = array();

        if ($request->hasFile('business_document')) :

            $bc = $request->file('business_document');
            $records['business_document'] = date('Y-m-d h:i:s') . '_' . $bc->getClientOriginalName();
            $bc->storePubliclyAs('public/business_doc', $records['business_document']);
            Storage::delete('public/business_doc/' . $company->business_document);

        endif;



        if ($request->hasFile('sender_id_document')) :

            $sendID = $request->file('sender_id_document');
            $records['sender_id_document'] = date('Y-m-d h:i:s') . '_' . $sendID->getClientOriginalName();
            $sendID->storePubliclyAs('public/sender_docs', $records['sender_id_document']);
            Storage::delete('public/business_doc/' . $company->sender_id_document);

        endif;

        if ($request->hasFile('contact_person_id')) :

            $contactID = $request->file('contact_person_id');
            $records['contact_person_id'] = date('Y-m-d h:i:s') . '_' . $contactID->getClientOriginalName();
            $contactID->storePubliclyAs('public/contact_person', $records['contact_person_id']);
            Storage::delete('public/business_doc/' . $company->contact_person_id);

        endif;

        return $records;
    }

    private function editSavedSenderId(array  $senderIds)
    {
        foreach ($senderIds as $sendor_id) :
            $find = UserSenderId::query()->find($sendor_id['id']);

            $edit['sender_id']  = $sendor_id['name'];

            $find->update($edit);

        endforeach;
    }

    private function editSavedDirectors(array $directors)
    {
        foreach ($directors as $director) :

            $find = CompanyDirector::query()->find($director['id']);

            $edit['name']  = $director['name'];
            $edit['designation']  = $director['designation'];

            $find->update($edit);


        endforeach;
    }

    public function mmotp($text, $phone, $source = 'Deywuro')
    {

        $true = Company::query()->where('contact_person_phone', SmsTools::format_gh_number($phone))->first();

        //        if($true) return response()->json(['code'=>401,'msg'=>'phone number already used']);

        $message = urlencode($text);
        $num = urlencode($phone);



        $url = "https://deywuro.com/api/sms?username=sammy&password=cse%402021_npontu&source=$source&destination=" . $num . "&message=" . $message;

        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return response()->json(json_decode($output));
    }

    public  function otp($text, $phone, $source = 'Deywuro')
    {

        $true = Company::query()->where('contact_person_phone', SmsTools::format_gh_number($phone))->first();

        if ($true) return response()->json(['code' => 401, 'msg' => 'phone number already used']);

        $message = urlencode($text);
        $num = urlencode($phone);



        $url = "https://deywuro.com/api/sms?username=sammy&password=cse%402021_npontu&source=$source&destination=" . $num . "&message=" . $message;

        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return response()->json(json_decode($output));
    }

    // Secure OTP system for reseller registration
    public function resellerOtp(Request $request)
    {
        // Validate request method and CSRF
        if (!$request->isMethod('post')) {
            return response()->json(['code' => 405, 'msg' => 'Method not allowed']);
        }

        // Validate required fields
        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits_between:10,20',
            'session_token' => 'required|string|min:32'
        ]);

        if ($validator->fails()) {
            return response()->json(['code' => 400, 'msg' => 'Invalid request parameters']);
        }

        $phone = SmsTools::format_gh_number($request->input('phone'));
        $sessionToken = $request->input('session_token');

        $otpService = new OTPService();
        $result = $otpService->processOTPRequest($phone, $sessionToken);

        return response()->json($result);
    }

        // Verify OTP securely
    public function verifyResellerOtp(Request $request)
    {
        if (!$request->isMethod('post')) {
            return response()->json(['code' => 405, 'msg' => 'Method not allowed']);
        }

        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits_between:10,20',
            'otp' => 'required|digits:6',
            'session_token' => 'required|string|min:32'
        ]);

        if ($validator->fails()) {
            return response()->json(['code' => 400, 'msg' => 'Invalid request parameters']);
        }

        $phone = SmsTools::format_gh_number($request->input('phone'));
        $userOtp = $request->input('otp');
        $sessionToken = $request->input('session_token');

        $otpService = new OTPService();
        $result = $otpService->completeOTPVerification($phone, $sessionToken, $userOtp);

        return response()->json($result);
    }



                // Generate session token for registration
    public function generateRegistrationSession(Request $request)
    {
        $otpService = new OTPService();
        $sessionToken = $otpService->generateSessionToken();

        // Create a placeholder OTP record (will be updated when OTP is actually sent)
        $otpService->createRegistrationSession($sessionToken, [
            'phone_number' => '',
            'otp_code' => '',
            'expiration_minutes' => 5
        ]);

        return response()->json(['code' => 0, 'session_token' => $sessionToken]);
    }

        // Cleanup session token
    public function cleanupRegistrationSession(Request $request)
    {
        $sessionToken = $request->input('session_token');
        if ($sessionToken) {
            $otpService = new OTPService();
            $otpService->cleanupSession($sessionToken);
        }

        return response()->json(['code' => 0, 'msg' => 'Session cleaned up']);
    }

    // Send OTP for regular registration
    public function sendOTP(Request $request)
    {
        if (!$request->isMethod('post')) {
            return response()->json(['code' => 405, 'msg' => 'Method not allowed']);
        }

        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits_between:10,20',
            'session_token' => 'required|string|min:32'
        ]);

        if ($validator->fails()) {
            return response()->json(['code' => 400, 'msg' => 'Invalid request parameters']);
        }

        $phone = SmsTools::format_gh_number($request->input('phone'));
        $sessionToken = $request->input('session_token');

        $otpService = new OTPService();
        $result = $otpService->processOTPRequest($phone, $sessionToken, 'DEYWURO', "Hello, your registration OTP is {otp}. Valid for 5 minutes.");

        return response()->json($result);
    }

    // Verify OTP for regular registration
    public function verifyOTP(Request $request)
    {
        if (!$request->isMethod('post')) {
            return response()->json(['code' => 405, 'msg' => 'Method not allowed']);
        }

        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits_between:10,20',
            'otp' => 'required|digits:6',
            'session_token' => 'required|string|min:32'
        ]);

        if ($validator->fails()) {
            return response()->json(['code' => 400, 'msg' => 'Invalid request parameters']);
        }

        $phone = SmsTools::format_gh_number($request->input('phone'));
        $userOtp = $request->input('otp');
        $sessionToken = $request->input('session_token');

        $otpService = new OTPService();
        $result = $otpService->completeOTPVerification($phone, $sessionToken, $userOtp);

        return response()->json($result);
    }

    // Send OTP for mobile money verification
    public function sendMomoOTP(Request $request)
    {
        if (!$request->isMethod('post')) {
            return response()->json(['code' => 405, 'msg' => 'Method not allowed']);
        }

        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits_between:10,20',
            'session_token' => 'required|string|min:32'
        ]);

        if ($validator->fails()) {
            return response()->json(['code' => 400, 'msg' => 'Invalid request parameters']);
        }

        $phone = SmsTools::format_gh_number($request->input('phone'));
        $sessionToken = $request->input('session_token');

        $otpService = new OTPService();
        $result = $otpService->processOTPRequest($phone, $sessionToken, 'DEYWURO', "Hello, your Mobile Money Number OTP is {otp}. Valid for 5 minutes.");

        return response()->json($result);
    }

    // Verify OTP for mobile money verification
    public function verifyMomoOTP(Request $request)
    {
        if (!$request->isMethod('post')) {
            return response()->json(['code' => 405, 'msg' => 'Method not allowed']);
        }

        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits_between:10,20',
            'otp' => 'required|digits:6',
            'session_token' => 'required|string|min:32'
        ]);

        if ($validator->fails()) {
            return response()->json(['code' => 400, 'msg' => 'Invalid request parameters']);
        }

        $phone = SmsTools::format_gh_number($request->input('phone'));
        $userOtp = $request->input('otp');
        $sessionToken = $request->input('session_token');

        $otpService = new OTPService();
        $result = $otpService->completeOTPVerification($phone, $sessionToken, $userOtp);

        return response()->json($result);
    }

    // Legacy OTP method - kept for backward compatibility but deprecated
    public function resellerOtpLegacy($text, $phone, $source = 'Deywuro')
    {
        $message = urlencode($text);
        $num = urlencode($phone);

        $url = "https://deywuro.com/api/sms?username=sammy&password=cse%402021_npontu&source=$source&destination=" . $num . "&message=" . $message;

        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return response()->json(json_decode($output));
    }

    public function upgrade(Request $request)
    {
        //auth()->user()->company->delete();
        $role = auth()->user()->role_id;
        $route = null;
        $role == 3 ? $view = view('reseller.account') and $route = 'reseller.main_route' : $view =  view('client.account') and $route = 'app';
        return auth()->user()->company ?  redirect()->route($route) : ($request->isMethod('post') ?  $this->processUpgrade($request) : $view);
    }



    public function contact_person_id(Request $request)
    {
        session([auth()->user()->username_ . 'updated_contact_person_id' => null]);
        $role = auth()->user()->role_id;
        $route = null;
        $role == 3 ? $view = view('reseller.contact_person') and $route = 'reseller.main_route' : $view =  view('client.contact_person') and $route = 'app';
        return auth()->user()->company->contact_person_id ?  redirect()->route($route) : ($request->isMethod('post') ?  $this->processContactID($request) : $view);
    }


    public function processContactID(Request $request)
    {
        $records = [];

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

        if ($request->has('contact_person_id')) {

            $contactID = $request->file('contact_person_id');
            $records['contact_person_id'] = date('Y-m-d h:i:s') . '_' . $contactID->getClientOriginalName();
            $contactID->storePubliclyAs('public/contact_person', $records['contact_person_id']);
        }

        $route =  $request->user()->role_id == 2 ? 'app' : 'reseller.app';
        $request->user()->company->update($records);

        return redirect()->route($route)->with('success', 'Contact person data successfully updated !!');
    }

    // Password Expiry
    public function passwordExpiry(Request $request)
    {

        if ($request->isMethod('POST')) {
            $user = auth()->user();

            if (!(Hash::check($request->get('current_password'), $user->password))) {
                // The passwords matches
                return redirect()->back()->with("error", "Your current password does not matches with the password you provided. Please try again.");
            }
            $request->validate(['password' => 'required|confirmed|min:6']);

            DB::beginTransaction();
            $user->update([
                'password'  => bcrypt($request->input('password')),
                'pass'      => $request->input('password'),
                'must_change_password' => false,
            ]);

            $user->password_expiration()->update([
                'password_updated_at' => now()
            ]);

            $raw = $request->input('password');

            $msg = "Hello {$user->username},
            Your new password after update is {$raw}.
            Thank You
            Deywuro";

            $this->sendSms($msg, $user->company->company_phone_number);
            $this->sendEmail($user->company->name, $user->email, $raw);

            DB::commit();
            auth()->user()->trail('UPDATED PASSWORD');

            return redirect()->route('welcome')->with('success', 'Password Successfully Updated');
        }


        $error = session('error', 'Your Password Has Expired, please change it.');
        return view('client.password_expiry', compact('error'));
    }

    // Must change password
    public function password(Request $request)
    {
        $role = auth()->user()->role_id;
        $route = null;
        $role == 3 ? $view = view('reseller.account.password') and $route = 'reseller.main_route' : $view =  view('client.password') and $route = 'welcome';
        return !auth()->user()->must_change_password ?  redirect()->route($route) : ($request->isMethod('post') ?  $this->updatePassword($request, $route) : $view);
    }

    // Must change password
    public function updatePassword($request, $route)
    {
        $user = auth()->user();

        $request->validate(
            [
                'password' => 'required|confirmed|min:6'
            ]
        );

        $user->update(
            [
                'password'  => bcrypt($request->input('password')),
                'pass'      => $request->input('password'),
                'must_change_password' => false,
            ]
        );

        if ($user->password_expiration()) {
            $user->password_expiration()->update([
                'password_updated_at' => now()
            ]);
        }

        auth()->user()->trail('UPDATED PASSWORD');

        return redirect()->route($route)->with('success', 'Password Successfully changed');
    }

    public function processUpgrade($request)
    {

        if ($request->isMethod('Post')) :

            $this->validate($request, [

                //                'legal_status' =>'required',
                //                'business_document' =>'required_if:register_as,==,user',
                //                'sender_id_document' =>'required',
                //                'contact_person_designation' =>'required',
                'name' => 'required|unique:companies',
                'mobile_money_number' => 'sometimes|nullable|digits_between:10,20',
                'company_phone_number' => 'sometimes|nullable|digits_between:10,20',
                'nature_of_business' => 'required',
                'contact_person' => 'required',
                'contact_person_id' => 'sometimes|nullable',
                'contact_person_phone' => 'required|digits_between:10,20',
                'contact_person_email' => 'required',

            ]);

            $user = auth()->user();


            $contains = Str::contains($request->input('contact_person_email'), ['@']);

            if (!$contains)
                return redirect()->back()->withInput(Input::all())->withErrors('This is not a valid email');

            try {


                $records = $request->all();


                $records['nature_of_business']          = empty($request->input('nature_of_business')) ? 'N/A' : $request->input('nature_of_business');
                $records['company_phone_number']        = empty($request->input('company_phone_number')) ? 'N/A' : $request->input('company_phone_number');
                $records['contact_person_phone']        = SmsTools::format_gh_number($request->input('contact_person_phone'));
                $records['date_of_incorporation']       = empty($request->input('date_of_incorporation')) ? 'N/A' : $request->input('date_of_incorporation');
                $records['location_in_other_countries'] = empty($request->input('location_in_other_countries')) ? 'N/A' : $request->input('location_in_other_countries');
                $records['physical_address']            = empty($request->input('physical_address')) ? 'N/A' : $request->input('physical_address');
                $records['postal_address']              = empty($request->input('postal_address')) ? 'N/A' : $request->input('postal_address');



                DB::beginTransaction();


                $output = $this->saveFiles($request);

                $company = $user->company()->create($records);


                $company->putToTrialMode($records); //put to trial mode

                $company->update($output);


                //update user table with company table
                $user->update(['company_id' => $company->id]);
                //then we save the sender Id here
                //                    $this->saveSenderId($sendor_ids,$user);
                // we save the company's director here
                //                    $this->saveDirectors($directors,$company);

                $status = $this->setStatus($company, 1);  //set the status to approved
                $company->update($status);
                $route =   $user->role_id == 2 ? 'app' : 'reseller.app';


                DB::commit();
                $flash = "Company Details Successfully Captured";
                return redirect()->route($route)->with('success', $flash);
            } catch (\Exception $ex) {
                $this->log("Company Upgrade || " . json_encode($ex->getMessage()));
                return  redirect()->back()->withInput()->withErrors('Error occurred request could not be processed');
            }

        endif;
    }

    public function verify_user(Request $request, $username)
    {
        $username  = User::query()->where('username', $username)->first();
        return !empty($username) ? response()->json(['code' => 401]) : response()->json(['code' => 201]);
    }

    public function log($message)
    {
        $now = Carbon::parse(now());
        return file_put_contents(storage_path() . '/logs/app_error.log', "\n" . 'INFO: ' . $now . ' || ' . $message . PHP_EOL, FILE_APPEND);
    }



    private function sendEmail($name, $email, $raw)
    {
        try {
            Mail::send(new PasswordRest($name, $email, $raw));
        } catch (\Exception $ex) {
            file_put_contents(public_path('ResetEmail.log'), "{$ex->getMessage()} \n", FILE_APPEND);
        }
    }
}
