<?php

namespace App\Http\Controllers;

use App\AuditTrail;
use App\Contact;
use App\ContactGroup;
use App\DataTables\ContactcgroupdataTable;
use App\DataTables\ContactdataTable;
use App\Imports\GroupImport;
use App\Tools\SmsTools;
use Carbon\Carbon;
use Illuminate\Http\Request;

use App\Http\Requests;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Session;
use Maatwebsite\Excel\Facades\Excel;

class AddressBookController extends Controller
{
    public function new_group() {
        return view('address_book.groups.new');
    }

    public function post_group(Request $request) {
        //validate request
        $this->validate($request, [
            'name' => 'required'
        ]);
        $inputs = $request->all();
        $user = $request->user();

        $existing = $user->groups()->where('name', $inputs['name'])->first();
        if($existing) {
            return redirect()->back()->withInput()->withErrors(array('name' => 'The group name already exists!'));
        }
        $user->groups()->create($inputs);

        //update audit_trail
        AuditTrail::create([
            'user_id' => $user->id,
            'username' => $user->username,
            'date' => Carbon::now()->toDateTimeString(),
            'activity' => $user->name.' created a new group '.$inputs['name']
        ]);

        $request->session()->flash('success', 'The group '.$inputs['name'].' was successfully created!');
        return redirect()->route('addressbook.groups');
    }

    public function edit_group($id) {
        $group = Auth::user()->groups()->findOrFail($id);
        return view('address_book.groups.edit', ['record'=>$group]);
    }

    public function update_group(Request $request, $id) {
        //validate request
        $this->validate($request, [
            'name' => 'required'
        ]);

        $inputs = $request->all();
        $user = $request->user();
        $currentRecord = $user->groups()->findOrFail($id);

        $existing = $user->groups()->where([
            ['name', '=', $inputs['name']],
            ['id', '!=', $id]
        ])->first();
        if($existing) {
            return redirect()->back()->withInput()->withErrors(array('name' => 'The group name already exists!'));
        }

        $currentRecord->fill($inputs);
        $currentRecord->save();

        //update audit_trail
        AuditTrail::create([
            'user_id' => $user->id,
            'username' => $user->username,
            'date' => Carbon::now()->toDateTimeString(),
            'activity' => $user->name.' updated an existing group to '.$inputs['name']
        ]);

        $request->session()->flash('success', 'The group has been successfully modified!');
        return redirect()->route('addressbook.groups');
    }

    public function delete_group(Request $request, $id) {
        $currentRecord = Auth::user()->groups()->findOrFail($id);
        $currentRecord->contacts()->delete();
        $currentRecord->delete();
        $request->session()->flash('success', 'The group '.$currentRecord->name.' was successfully deleted!');
        return redirect()->route('addressbook.groups');
    }

    public function getAllGroup(ContactcgroupdataTable $dataTable) {
        return $dataTable->render('address_book.groups.index');
    }

    public function bulk_upload($group_id) {
        $group = Auth::user()->groups()->findOrFail($group_id);
        return view('address_book.contacts.bulk', ['group'=>$group]);
    }

    public function post_bulk_upload(Request $request, $group_id) {
        $this->validate($request, [
            'file_upload' => 'required|file',
        ]);

        $user = Auth::user();
        $group = $user->groups()->findOrFail($group_id);
        $addedcontact = 0;

        $current_filename = $request->file('file_upload')->getClientOriginalName();
        $filename_splitted = explode(".", $current_filename);
        $extension = end($filename_splitted);

        $destinationPath = storage_path() . DIRECTORY_SEPARATOR. 'uploads' . DIRECTORY_SEPARATOR;
        $fileName = uniqid("{$user->username}_") . '.' . $extension;
        $full_filename = $destinationPath . $fileName;

        if ($request->file('file_upload')->isValid()) {
            $request->file('file_upload')->move($destinationPath, $fileName);
        } else {
            return Redirect::back()->withInput()->withErrors(array('file_upload' => 'Sorry, The file upload failed!'));
        }

        try {
            Excel::import(new GroupImport($user, $group,$addedcontact),$full_filename,null);
        } catch (\Exception $e) {
            @unlink($full_filename);
            return Redirect::back()->withInput()->withErrors(array('file_upload' => 'Error! Your excel file is invalid!'));
        }

        //remove file after upload
        @unlink($full_filename);

        Session::flash('success',  'Contact(s) was successfully added to '.$group->name);
        return redirect()->route('addressbook.contacts', ['group_id'=>$group_id]);
    }

    public function getAllContact(Request $request, ContactdataTable $dataTable, $group_id) {
        $group = $request->user()->groups()->findOrFail($group_id);
        if($request->method()=='POST') {
            $selection = $request->get('selection');
            $deleted = 0;

            if(!empty($selection)) {
                DB::beginTransaction();
                foreach ($selection as $sel) {
                    $contactToDel = $group->contacts()->find($sel);
                    if(!empty($contactToDel)) {
                        $contactToDel->delete();
                        $deleted++;
                    }
                }
                DB::commit();
            }
            Session::flash('success', $deleted. ' contact(s) was successfully deleted from '.$group->name);
        }
        return $dataTable->render('address_book.contacts.index', ['group'=>$group]);
    }

    public function new_contact($group_id) {
        $group = Auth::user()->groups()->findOrFail($group_id);
        return view('address_book.contacts.new', ['group'=>$group]);
    }

    public function post_contact(Request $request, $group_id) {
        //validate request
        $this->validate($request, [
            'name' => 'present',
            'phone_number' => 'required',
            'email' => 'nullable|email'
        ]);
        $inputs = $request->all();
        $user = $request->user();
        $group = $user->groups()->findOrFail($group_id);
        $inputs['user_id'] = $user->id;

        $inputs['phone_number'] = SmsTools::format_gh_number($request['phone_number']);

        $existing = $user->groups()->findOrFail($group_id)->contacts()->where('phone_number', $inputs['phone_number'])->first();
        if($existing) {
            return redirect()->back()->withInput()->withErrors(array('name' => 'The phone number already exists in '.$group->name));
        }
        if(!empty($inputs['email'])) {
            $existing = $user->groups()->findOrFail($group_id)->contacts()->where('email', $inputs['email'])->first();
            if($existing) {
                return redirect()->back()->withInput()->withErrors(array('name' => 'The email already exists in '.$group->name));
            }
        }
        $group->contacts()->create($inputs);

        //update audit_trail
        AuditTrail::create([
            'user_id' => $user->id,
            'username' => $user->username,
            'date' => Carbon::now()->toDateTimeString(),
            'activity' => $user->name.' added a new contact '.$inputs['name']. ' '.$inputs['phone_number'].' to '.$group->name
        ]);

        $request->session()->flash('success', $inputs['name'].' was successfully been added to '.$group->name);
        return redirect()->back();
    }

    public function edit_contact($group_id, $id) {
        $group = Auth::user()->groups()->findOrFail($group_id);
        $contact = $group->contacts()->findOrFail($id);
        return view('address_book.contacts.edit', ['contact'=>$contact, 'group'=>$group]);
    }

    public function update_contact(Request $request, $group_id, $id) {
        //validate request
        $this->validate($request, [
            'name' => 'present',
            'phone_number' => 'required',
            'email' => 'nullable|email'
        ]);

        $group = Auth::user()->groups()->findOrFail($group_id);
        $currentRecord = $group->contacts()->findOrFail($id);

        $inputs = $request->all();
        $user = $request->user();

        $inputs['phone_number'] = SmsTools::format_gh_number($request['phone_number']);

        $existing = $group->contacts()->where([
            ['phone_number', '=', $inputs['phone_number']],
            ['id', '!=', $id]
        ])->first();
        if($existing) {
            return redirect()->back()->withInput()->withErrors(array('phone_number' => 'The phone number already exists!'));
        }
        if(!empty($inputs['email'])) {
            $existing = $group->contacts()->where([
                ['email', '=', $inputs['email']],
                ['id', '!=', $id]
            ])->first();
            if($existing) {
                return redirect()->back()->withInput()->withErrors(array('email' => 'The email already exists!'));
            }
        }

        $currentRecord->fill($inputs);
        $currentRecord->save();

        //update audit_trail
        AuditTrail::create([
            'user_id' => $user->id,
            'username' => $user->username,
            'date' => Carbon::now()->toDateTimeString(),
            'activity' => $user->name.' updated an existing contact to '.$inputs['phone_number']
        ]);

        $request->session()->flash('success', 'The contact has been successfully updated!');
        return redirect()->route('addressbook.contacts', ['group_id'=>$group_id]);
    }

    public function delete_contact($group_id, $id) {
        $group = Auth::user()->groups()->findOrFail($group_id);
        $currentRecord = $group->contacts()->findOrFail($id);
        $currentRecord->delete();
        session()->flash('success', $currentRecord->phone_number.' was successfully deleted from '.$group->name);
        return redirect()->route('addressbook.contacts', ['group_id'=>$group_id]);
    }
}
