<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use App\Department;
use App\Annexure_Status;
use App\AdminModel;
use App\AdminOtp;
use App\ConflictOfInterest;
use App\Annexure_One;
use App\Annexure_Two;
use App\Annexure_Three;
use App\Annexure_Four;
use App\Division;
use App\Annexure_Five;
use Illuminate\Support\Facades\DB;
use App\Assess;
use Illuminate\Support\Facades\Log;
use App\Annexure_Six;
use App\Annexure_Seven;
use App\Annexure_Eight;
use App\CoiUsers;
use App\Annexure_Nine;
use Illuminate\Support\Facades\Hash;
use App\Annexure_Ten;
use App\Annexure_Eleven;
use App\Annexure_Twelve;
use App\Annexure_Thirteen;
use App\Annexure_Fourteen;
use App\Annexure_Fifteen;
use App\Annexure_Sixteen;
use App\AuditTrail;
use App\Charts\DashboardCharts;
use App\CoeForm;
use LaravelDaily\LaravelCharts\Classes\LaravelChart;
use PDF;
use App\VerifiedUsers;
use App\UsersDb;
use App\DataTables\UsersDataTable;
use App\DataTables\NotStartedDatatable;
use App\DataTables\StartedDatatable;
use App\DataTables\AuditTrailDataTable;
use App\DataTables\CoECompletedDataTable;
use App\DataTables\CoEPendingDataTable;
use App\DataTables\GetCompletedDatatable;
use App\General;
use Carbon\Carbon;
use Illuminate\Support\Facades\Session;


use Illuminate\Http\Request;

class AdminController extends Controller
{
    // public function __construct()
    // {
    //   $this->middleware('inactivity')->except(['index', 'login']);
    // }
    public function index()
    {
        return view('admin.index');
    }

    public function login(Request $request)
    {
        $email = $request->input('email');
        $password = $request->input('password');

        $validator = Validator::make($request->all(), [
            'email' => 'email|required',
            'password' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->with('error', 'Enter Email/Password!');
        }
        $credentials = $request->only('email', 'password');
        $admin = AdminModel::all()->where('email', 'LIKE', $email)->first();

        if ($admin !== null) {
            Auth::guard('adminguard')->login($admin);

            $otp = General::admin_OTP($request->email);
            try {
                $response = General::admin_otp_mail('SCANCOM PLC (MTN Ghana) Conflict of Interest Policy & Code of Ethics', $email, "Kindly enter OTP: " . $otp . " to proceed to your dashboard. \\n\\nThanks,\\nMTN CoI-CoE 2023");
                $data = ['email' => $email, 'otp' => $otp, 'password' => $password];
                Log::info($response);
                //                return redirect()->route('dashboard');
                return view('admin.otp_verification', $data);
            } catch (\Throwable $th) {
                Log::info($th->getMessage());
                return redirect()->back()->with('error', 'Sorry, we have encountered an error');
            }
        } else {
            return redirect('admin')->with('error', 'Your record cannot be found');
        }
    }


    public function OTP_Verification(Request $request)
    {
        $email = $request->input('email');
        $password = $request->input('password');

        $one = $request->input('one');
        $two = $request->input('two');
        $three = $request->input('three');
        $four = $request->input('four');
        // dd($request->all());
        $code = $one . $two . $three . $four;
        Log::channel('coi')->info('Admin with email: ' . $email . ' is about verifying otp:' . $code);
        $otp_data = AdminOtp::query()->latest()->where('email', $email)->first();
        // dd($otp_data->otp);
        if ($otp_data !== null && $code == $otp_data->otp) {

            $afterTwoMinutes = Carbon::now()->subMinutes(2);
            // $TimeCreated = $otp->created_at;

            if ($afterTwoMinutes->isAfter($otp_data->created_at)) {
                $data = [
                    'email' => $email,
                    'password' => $password,
                ];

                Session::flash('error', 'Expired OTP Inputted!');
                AuditTrail::create([
                    'userid' => 'N/A',
                    'name' => 'N/A',
                    'activity' => 'Expired OTP Verification: User with email ' . $email . ' Expired otp Verification. Code entered was ' . $code,
                    // 'message',
                ]);
                $otp_data->delete();

                return view('admin.otp_verification', $data);
            }

            Log::channel('coi')->info('OTP: ' . $code . ' verified for Admin with email: ' .
                $email . 'Checking to redirect to dashboard');

            // dd($request->all());
            // if (Auth::guard('adminguard')->attempt(
            //   ['email' => $email, 'password' => $password]
            // )) {
            Auth::guard('adminguard')->attempt(
                ['email' => $email, 'password' => $password]
            );

            Session::put('login', true);

            $admin = AdminModel::where('email', $email)->first();
            // Auth::login($user);
            session(['adminid' => $admin->id]);
            session('admin_email', $email);

            // Auth::login($admin);
            $otp_data->delete();
            $admin->log('(Admin):Logged In to dashboard');
            return redirect()->route('dashboard');
            // } else {
            //   Log::info('llll: '.$login);
            //   return redirect()->back()->with('error', 'Your record cannot be found!');
            // }
        } else {
            $data = [
                'email' => $email,
                'password' => $password,
                //'otp' => $otp
            ];

            Session::flash('error', 'Invalid OTP Inputted!');
            AuditTrail::create([
                'userid' => 'N/A',
                'name' => 'N/A',
                'activity' => 'Failed OTP Verification: User with email/phone ' . $email . ' Failed otp Verification. Code entered was ' . $code,
                // 'message',
            ]);
            return view('admin.otp_verification', $data);
        }
    }

    public function resendAdminOTP(Request $request)
    {
        $email = $request->input('email');

        $admin = AdminModel::where('email', $request->email)->first();
        // dd($admin);
        $email = $request->email;
        $password = $admin->password;

        $otp = General::admin_OTP($email);

        try {
            $response = General::admin_otp_mail('SCANCOM PLC (MTN Ghana) Conflict of Interest Policy & Code of Ethics', $email, "Kindly enter OTP: " . $otp . " to proceed to your dashboard. \\n\\nThanks,\\nMTN CoI-CoE 2023");
            $data = ['email' => $email, 'otp' => $otp, 'password' => $password];
            Log::info($response);
            return view('admin.otp_verification', $data);
        } catch (\Throwable $th) {
            Log::info($th->getMessage());
            return redirect()->back()->with('error', 'Sorry, we have encountered an error');
        }
    }



    public function dashboard()
    {
        $current_year = Carbon::now()->year;
        $countuserscoi = DB::select("SELECT email FROM coi_users WHERE dept IS NOT NULL AND deleted_at IS NULL AND YEAR(created_at) = $current_year");

        $countpendingcoi = count(DB::select("SELECT email FROM `coi_users` WHERE dept IS NOT NULL AND deleted_at IS NULL AND coi_status IS NULL AND status IS NULL AND YEAR(created_at) = $current_year"));

        $countstartedscoi = count(DB::select("SELECT email FROM `coi_users` where  dept IS NOT NULL AND deleted_at IS NULL AND YEAR(created_at) = $current_year AND (coi_status = 'Agree' AND status = 'Pending') OR (coi_status IS NULL AND status = 'Pending')"));

        $countcompletedcoi = count(DB::select("SELECT email FROM `coi_users` where  dept IS NOT NULL AND deleted_at IS NULL AND coi_status='Agree' AND status IN ('Completed','Updated','UpdatedFromLastYear') AND YEAR(created_at) = $current_year"));

        $countcompletedcoe = DB::select("SELECT * FROM coi_users WHERE YEAR(created_at) = $current_year AND deleted_at IS NULL and dept IS NOT NULL and id IN (Select coi_user_id from coe_forms) GROUP BY id"); //889

        $totalUsers = collect($countuserscoi)->keyBy('email');
        $totalFromCoeForms = collect($countcompletedcoe)->keyBy('email');

        $countcompletedcoe = count($countcompletedcoe);

        $countpendingcoe = DB::select("SELECT * FROM coi_users WHERE YEAR(created_at) = $current_year AND deleted_at IS NULL and dept IS NOT NULL and id NOT IN (Select coi_user_id from coe_forms) GROUP BY id"); //889

        $countpendingcoe = count($countpendingcoe);

        $countuserscoe = count($countuserscoi);
        $countuserscoi = count($countuserscoi);

        $data = [
            'completedcoe' => $countcompletedcoe,
            'pendingcoe' => $countpendingcoe,
            'userscoe' => $countuserscoe,

            'completed' => $countcompletedcoi,
            'pending' => $countpendingcoi,
            'users' => $countuserscoi,
            'coi' => $countstartedscoi,
        ];

        return view('admin.dashboard', $data);
    }

    public function coeDashboard()
    {
        $countcompleted = CoeForm::query()->where('agreed', '1')->count();
        $countusers = CoiUsers::query()->count();
        $countpending = CoiUsers::query()
            ->whereDoesntHave('coeForm', function ($query) {
                $query->where('agreed', '1');
            })
            ->count();
        $data = [
            'completed' => $countcompleted,
            'pending' => $countpending,
            'users' => $countusers,
        ];
        return view('admin.coe-dashboard', $data);
    }

    public function users(UsersDataTable $datatable)
    {
        $dept = Department::get();
        $division = Division::get();
        $data = [
            'dept' => $dept,
            'division' => $division,
        ];
        $adminidd = Session::get('adminid');
        $admin = AdminModel::where('id', $adminidd)->first();
        $admin->log('(Admin):Redirected to View Users');
        return $datatable->render('admin.users.users', $data);
    }

    public function addusers(Request $request)
    {

        $validator = Validator::make($request->all(), [
            'email' => 'email|required',
            'name' => 'required',
            'department' => 'required,',
            'level' => 'required',
            'emp' => 'required',
            'is_director' => 'required',
            // 'division'=>'required',
        ]);

        $name = $request->input('name');
        $email = $request->input('email');
        $department = $request->input('dept');
        $phone = $request->input('phone');
        $username = $request->input('username');
        $level = $request->input('level');
        $emp = $request->input('emp');

        if ($validator->fails()) {

            return redirect()->back()->with('error', 'Name, Email, Department, Level & Employment Status,Division Fields are Required');
        }
        $getdept = Department::where('id', $department)->first();
        // return $getdept;
        $checknum = CoiUsers::where('phone', $phone)->whereNull('deleted_at')->count();
        if ($checknum > 0) {
            return redirect()->back()->with('error', 'Phone number already taken');
        }
        // $div = $getdept->division;
        $users = new CoiUsers();
        $users->name = $name;
        $users->email = $email;
        $users->dept = $department;
        $users->phone = $phone;
        $users->username = $username;
        $users->division = $request->division ?? null;
        $users->level = $level;
        $users->employment_status = $emp;
        $users->is_director = $request->is_director;

        $users->save();
        $adminidd = Session::get('adminid');
        $admin = AdminModel::where('id', $adminidd)->first();
        $admin->log('(Admin):Added A New User with name' . $name . ' and email' . $email);

        Session::flash('success', 'New User Added !');
        return redirect()->route('users');
    }

    public function show($id)
    {
        $user = CoiUsers::query()->where('id', $id)->first();

        $data = [
            'user' => $user
        ];
        $adminidd = Session::get('adminid');
        $admin = AdminModel::where('id', $adminidd)->first();
        $admin->log('(Admin):Redirected to view ' . $user->name . 's details, id :(' . $user->id . ')');
        return view('admin.users.show', $data);
    }

    public function edit($id)
    {
        $user = CoiUsers::where('id', $id)->first();
        $dept = Department::get();
        $division = Division::get();

        $data = [
            'user' => $user,
            'dept' => $dept,
            'division' => $division
        ];

        return view('admin.users.edit', $data);
    }


    public function update($id, Request $request)
    {
        // return $request;
        $name = $request->input('name');
        $email = $request->input('email');
        $dept = $request->input('dept');
        $username = $request->input('username');
        $phone = $request->input('phone');
        $div = Department::query()->where('id', $dept)->first();
        $user = CoiUsers::where('id', $id)->first();

        $checknum = CoiUsers::where('phone', $phone)->count();
        $checkmail = CoiUsers::where('email', $email)->count();
        // if ($checknum >0 ) {
        //   return redirect()->back()->with('error', 'Phone number already taken');
        // }
        //
        // if ($checkmail >0 ) {
        //   return redirect()->back()->with('error', 'Email already taken');
        // }

        $user->name = $name;
        $user->email = $email;
        $user->dept = $div->name;
        $user->username = $username;
        $user->is_director = $request->is_director;
        $user->phone = $phone;
        $user->division = $request->division;
        // $user->division=$div->division;
        $user->save();
        $adminidd = Session::get('adminid');
        $admin = AdminModel::where('id', $adminidd)->first();
        $admin->log('(Admin):Edited user with id ' . $user->id . 'user name is ' . $user->name);
        Session::flash('success', 'User Updated!');
        return redirect()->route('users');
    }

    public function delete($id)
    {
        $user = CoiUsers::where('id', $id)->first();
        // $a1 = Annexure_One::query()->where('userid',$id)->first();
        //
        // $a2 = Annexure_Two::query()->where('userid',$id)->first();
        //
        // $a3 = Annexure_Three::query()->where('userid',$id)->first();
        //
        // $a4 = Annexure_Four::query()->where('userid',$id)->first();
        //
        // $a5 = Annexure_Five::query()->where('userid',$id)->first();
        //
        // $a6 = Annexure_Six::query()->where('userid',$id)->first();
        //
        // $a7 = Annexure_Seven::query()->where('userid',$id)->first();
        //
        // $a8 = Annexure_Eight::query()->where('userid',$id)->first();
        //
        // $a9 = Annexure_Nine::query()->where('userid',$id)->first();
        //
        // $a10 = Annexure_Ten::query()->where('userid',$id)->first();
        //
        // $a11 = Annexure_Eleven::query()->where('userid',$id)->first();
        //
        //
        // $a12 = Annexure_Twelve::query()->where('userid',$id)->first();
        //
        //
        // $a13 = Annexure_Thirteen::query()->where('userid',$id)->first();
        //
        //
        // $a14 = Annexure_Fourteen::query()->where('userid',$id)->first();
        //
        //
        // $a15 = Annexure_Fifteen::query()->where('userid',$id)->first();
        //
        // $a16 = Annexure_Sixteen::query()->where('userid',$id)->first();
        // $coi = ConflictOfInterest::query()->where('userid',$id)->first();
        // $stst = Annexure_Status::query()->where('userid',$id)->first();
        // $user->deleteRelation()->delete();
        // if ($a1 !== null) {
        //   $a1->delete();
        // }
        //
        // if ($a2 !== null) {
        //   $a2->delete();
        // }
        //
        // if ($a3 !== null) {
        //   $a3->delete();
        // }
        //
        // if ($a4 !== null) {
        //   $a4->delete();
        // }
        //
        // if ($a5 !== null) {
        //   $a5->delete();
        // }
        //
        // if ($a6 !== null) {
        //   $a6->delete();
        // }
        //
        // if ($a7 !== null) {
        //   $a7->delete();
        // }
        //
        // if ($a8 !== null) {
        //   $a8->delete();
        // }
        //
        // if ($a9 !== null) {
        //   $a9->delete();
        // }
        //
        // if ($a10 !== null) {
        //   $a10->delete();
        // }
        //
        // if ($a11 !== null) {
        //   $a11->delete();
        // }
        //
        // if ($a12 !== null) {
        //   $a12->delete();
        // }
        //
        // if ($a13 !== null) {
        //   $a13->delete();
        // }
        //
        // if ($a14 !== null) {
        //   $a14->delete();
        // }
        //
        // if ($a15 !== null) {
        //   $a15->delete();
        // }
        //
        // if ($a16 !== null) {
        //   $a16->delete();
        // }
        //
        // if ($coi !== null) {
        //   $coi->delete();
        // }
        //
        // if ($stst !== null) {
        //   $stst->delete();
        // }

        if ($user !== null) {
            $delassess = Assess::where('userid', $user->id)->delete();
            $user->delete();
        }

        $adminidd = Session::get('adminid');
        $admin = AdminModel::where('id', $adminidd)->first();
        $admin->log('(Admin):Deleted User with id ' . $user->id . ' user name is ' . $user->name);
        $user->delete();

        Session::flash('success', 'User Deleted!');
        return redirect()->route('users');
    }



    public function logout()
    {
        // $admin->log('(Admin):Logged out');
        Auth::guard('adminguard')->logout();
        Session::put('login', false);
        return redirect()->route('index');
    }
    public function notstarted(NotStartedDatatable $dt)
    {
        // $r = UsersDb::query()->doesntHave('annex_status')->get();
        // return $r;
        $data = ['message' => 'List of Members who have not started COI'];
        return $dt->render('admin.notstarted', compact('data'));
    }

    public function getstarted(StartedDatatable $dt)
    {
        return $dt->render('admin.started');
    }

    public function getcompleted(GetCompletedDatatable $dt)
    {
        $data = ['message' => 'List of Members Who Have Completed COI'];
        return $dt->render('admin.completed', compact('data'));
    }

    public function getCoEPending(CoEPendingDataTable $dt)
    {
        $data = ['message' => 'List of Members who have not started CoE'];
        return $dt->render('admin.notstarted', compact('data'));
    }

    public function getCoECompleted(CoECompletedDataTable $dt)
    {
        $data = ['message' => 'List of Members Who Have Completed CoE'];
        return $dt->render('admin.completed', compact('data'));
    }

    public function audittrails(AuditTrailDataTable $dt)
    {
        return $dt->render('admin.audittrail');
    }


    public function profile()
    {
        return view('admin.profile.index');
    }

    public function updateprofile(Request $r)
    {
        $id = auth()->guard('adminguard')->user()->id;

        if ($r->password == null || $r->newpassword == null || $r->password_confirmation == null) {
            // update only name n email
            // return $r;
            $update = AdminModel::where('id', $id)->update([
                'name' => $r->name,
                'email' => $r->email,
            ]);

            return back()->with('success', 'Profile Updated Successfully');
        }


        if ($r->password !== null && $r->newpassword !== null && $r->password_confirmation !== null) {
            if (Hash::check($r->password, auth()->guard('adminguard')->user()->password)) {

                $error_data = General::passwordComplexity($r->newpassword);

                if ($r->newpassword == $r->password_confirmation) {
                    if (count($error_data) == 0) {
                        // update profile including password
                        $update = AdminModel::where('id', $id)->update([
                            'name' => $r->name,
                            'email' => $r->email,
                            'password' => bcrypt($r->password_confirmation)
                        ]);
                        // dd($r->count($error_data));
                        return back()->with('success', 'Profile Updated Successfully');
                    } else {
                        // dd(count($error_data));
                        return back()->with('my_errors', $error_data);
                    }
                } else {
                    return back()->with('error', 'New Passwords Do not Match ');
                }
            } else {
                return back()->with('error', 'Old Password Does not Match Our Records');
            }
        }
    }
}
