<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models;
use Auth;
use App\Http\Requests\AddCompanyRequest;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
use App\Models\User;
use App\Models\UserProfile;
use App\Models\RoleUser;
use App\Models\Company;
use App\Models\CompanyLocation;
use App\Models\CompanyAdmin;
use DB;
use Session;
use Validator;
use Exception;
use Mail;
use App\Services\DefaultServices;
use Illuminate\Support\Str;

class CompanyController extends Controller {

    protected $defaultServices;

    public function __construct(DefaultServices $defaultServices)
    {
        $this->defaultServices = $defaultServices;
    }

    public function index(Request $request)
    {
        if($request->ajax()) {
            $is_active = $request->checkstatus;
            $filters   = [];

            if($is_active != '') {
                $filters['is_active'] = $is_active;
            }

            $filters['is_delete'] = 0;

            $allData = Company::where($filters);

            return datatables($allData)->make(true);
        }

        return view('superAdmin.company.index');
    }

    public function addCompany() {
        return view('superAdmin.company.addCompany');
    }

    public function saveCompany(AddCompanyRequest $request)
	{
      try {
            $userType = 'super-admin';
            $status = 0;

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

                $request->validated();

                $logo                = $request->file('logo');
                $admin_profile_image = $request->file('admin_profile_image');
                
                // company
                $companyArr['company_name']    = trim($request->company_name) ?: NULL;
                $companyArr['company_desc']    = trim($request->company_desc) ?: NULL;
                $companyArr['company_address'] = trim($request->company_address) ?: NULL;
                $companyArr['company_website'] = trim($request->website) ?: NULL;
                $companyArr['company_phone']   = trim($request->company_phone) ?: NULL;

                if($logo) {
                    $rootFolderPath = public_path('/storage/images/company/logo');
                    $companyArr['company_logo'] = $this->defaultServices->imgUpload($rootFolderPath, $logo);
                }

                $companyDetails = Company::create($companyArr);

                // company admin
                $companyAdminArr['first_name'] = trim($request->user_first_name) ?: NULL;
                $companyAdminArr['last_name']  = trim($request->user_last_name) ?: NULL;
                $companyAdminArr['name']       = $companyAdminArr['first_name'].' '.$companyAdminArr['last_name'];
                $companyAdminArr['email']      = trim($request->user_email) ?: NULL;
                //$companyAdminArr['password']   = Hash::make(Str::random(6));
                $companyAdminArr['password']   = Hash::make(random_password());
                

                $companyAdminDetails = User::create($companyAdminArr);

                // company admin profile
                $companyAdminProfileArr['user_id'] = $companyAdminDetails->id;
                $companyAdminProfileArr['phone'] = trim($request->user_phone) ?: NULL;

                if($admin_profile_image) {
                    $rootFolderPath = public_path('/storage/images/user');
                    $companyAdminProfileArr['image'] = $this->defaultServices->imgUpload($rootFolderPath, $admin_profile_image);
                }

                UserProfile::create($companyAdminProfileArr);

                // company admin role
                RoleUser::create(['user_id' => $companyAdminDetails->id, 'role_id' => 2]);
                
                // company admin and company association
                $companyAssoAdminArr['user_id'] = $companyAdminDetails->id;
                $companyAssoAdminArr['company_id'] = $companyDetails->id;

                CompanyAdmin::create($companyAssoAdminArr);

                $verification_link = get_email_activation_url('email-verification', $companyAdminDetails->id, strtotime(date('Y-m-d H:i:s')));

                $to_email = $companyAdminDetails->email;
                $to_name  = $companyAdminDetails->name;
                $subject = 'Email Activation Link';

                $mail_data = array(
                    'verification_link' => $verification_link,
                    'to_email'          => $to_email
                );

                $send_verification_mail = send_verfication_mail($mail_data, $to_email, $to_name, $subject);
                $request->session()->flash('success-message', 'Company added successfully');  
            }

            return redirect()->back();
        }
        catch (Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage()]]);
        }
    }

    public function editCompany(Request $request) {
        $company_details = Company::find($request->id);
        $user_details = $company_details->companyAdmins->first();

        return view('superAdmin.company.editCompany')->withUserDetails($user_details)->withCompanyDetails($company_details);
    }

    public function updateCompany(AddCompanyRequest $request) {
        try {
            $userType = 'super-admin';
            $status = 0;
            $request->validated();

            $logo                = $request->file('logo');
            $admin_profile_image = $request->file('admin_profile_image');

            // company
            $companyDetails = Company::find($request->company_id);            
            $companyDetails->company_name    = trim($request->company_name) ?: NULL;
            $companyDetails->company_desc    = trim($request->company_desc) ?: NULL;
            $companyDetails->company_address = trim($request->company_address) ?: NULL;
            $companyDetails->company_website = trim($request->website) ?: NULL;
            $companyDetails->company_phone   = trim($request->company_phone) ?: NULL;

            if($logo) {
                $rootFolderPath = public_path('/storage/images/company/logo');

                if($companyDetails->company_logo) {
                    $this->defaultServices->unlinkImg($rootFolderPath, $companyDetails->company_logo);
                }

                $companyDetails->company_logo = $this->defaultServices->imgUpload($rootFolderPath, $logo);
            }

            $companyDetails->save();

            // company admin
            $companyAdminDetails = $companyDetails->companyAdmins->first();
            $companyAdminDetails->first_name = trim($request->user_first_name) ?: NULL;
            $companyAdminDetails->last_name = trim($request->user_last_name) ?: NULL;
            $companyAdminDetails->name = $companyAdminDetails->first_name.' '.$companyAdminDetails->last_name;
            $companyAdminDetails->save();

            // company admin profile
            $companyAdminDetails->userProfile->phone = trim($request->user_phone) ?: NULL;

            if($admin_profile_image) {
                $rootFolderPath = public_path('/storage/images/user');

                if($companyAdminDetails->userProfile->image) {
                    $this->defaultServices->unlinkImg($rootFolderPath, $companyAdminDetails->userProfile->image);
                }

                $companyAdminDetails->userProfile->image = $this->defaultServices->imgUpload($rootFolderPath, $admin_profile_image);
            }

            $companyAdminDetails->userProfile->save();

            $request->session()->flash('success-message', 'Company updated successfully');
            return redirect()->back();

        }catch (Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage()]]);
        }
    }

    public function changeCompanyStatus(Request $request) {
        try {
            $success = Company::where('id', $request->company_id)->update(['is_active' => $request->is_active]);
            return response()->json(['success' => true, 'result' => $success], 200);
        }
        catch(Exception $ex) {
            return response()->json(['success' => false, 'result' => [] ], 201);
        }
    }

    public function companyLocation(Request $request) {
        $comapany_id=$request->id;
        return view('superAdmin.company.location',compact('comapany_id'));
    }

    public function getCompanyLocation(Request $request) {
        $comapany_id=$request->comapany_id;
        $companyDetails = Company::where('id',$comapany_id)->first();
        if($request->ajax()) {
            $is_active = $request->checkstatus;
            $filters   = [];

            if($is_active != '') {
                $filters['is_active'] = $is_active;
            }

            $filters['is_delete'] = 0;

            $allData = CompanyLocation::with(['getCompany'])
                        ->whereHas("getCompany", function ($query) use($companyDetails) {
                            $query->where([
                                ['companies.id', '=', $companyDetails->id]
                            ]);
                        })
                        ->where($filters);

            //return $allData;die;
            return datatables($allData)->make(true);
        }
    }

    public function addCompanyLocation(Request $request) {
        $company_id=$request->id;
        return view('superAdmin.company.addLocation',compact('company_id'));
    }

    public function saveCompanyLocation(Request $request) {
        $company_id=$request->id;
        try {
            $messages = [
                'companyLocationName.required' => 'Please Enter Company Location Name',
                'companyLocationAddress.required' => 'Please Enter Company Location Address',
                'companyLocationAddress.unique' => 'Please Enter Different Company Location Address',
            ];

            $validator = Validator::make($request->all(), [
                'companyLocationName' => 'required|string',
                "companyLocationAddress" => 'required|string|unique:company_locations,address',
            ], $messages);

            if($validator->fails()) {
                return redirect()->back()->withErrors($validator->errors());
            }

            $companyLocation = new CompanyLocation();
            $companyLocation->company_id = $company_id;
            $companyLocation->name = trim($request->companyLocationName)?:NULL;
            $companyLocation->address = trim($request->companyLocationAddress)?:NULL;
            $companyLocation->save();

            $request->session()->flash('success-message', 'Company Location Added Succeessfully');
            return redirect(route('superAdmin.companyLocation',$company_id));
        }
        catch(Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage() ]]);
        }
    }

    public function changeLocationStatus(Request $request) {
        try {
            $success = CompanyLocation::where('id', $request->id)->update(['is_active' => !$request->is_active]);
            return response()->json(['success' => true, 'result' => $success], 200);
        }
        catch(Exception $ex) {
            return response()->json(['success' => false, 'result' => [] ], 201);
        }
    }

}
