<?php

namespace App\Http\Controllers\Esme;

use App\AuditTrail;
use App\Contact;
use App\ContactGroup;
use App\DataTables\ResellerContactcgroupdataTable;
use App\DataTables\ResellerContactdataTable;
use App\Http\Controllers\Controller;
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('esme.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('esme.addressbook.groups');
    }

    public function edit_group($id) {
        $group = Auth::user()->groups()->findOrFail($id);
        return view('esme.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('esme.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('esme.addressbook.groups');
    }

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

    public function bulk_upload($group_id) {
        $group = Auth::user()->groups()->findOrFail($group_id);
        return view('esme.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::load($full_filename, function ($reader)
            use (&$request, &$user, &$group, &$addedcontact) {
                DB::beginTransaction();
                foreach ($reader->toArray() as $row) {
                    $values = array_values($row);

                    if(!empty($values[0])) {
                        $inputs = [
                            'phone_number' => $values[0],
                            'name' => isset($values[1]) ? $values[1]: null,
                            'user_id' => $user->id
                        ];

                        //check if phone number already exist
                        $existing = $group->contacts()
                                          ->where('phone_number', $inputs['phone_number'])
                                          ->first();
                        if (!empty($existing)) {
                            //skip existing contact
                            continue;
                        }

                        //create new contact
                        $group->contacts()->create($inputs);
                        $addedcontact++;
                    }
                }
                DB::commit();
            });

            //update audit_trail
            AuditTrail::create([
                'user_id' => $user->id,
                'username' => $user->username,
                'date' => Carbon::now()->toDateTimeString(),
                'activity' => $user->name.' uploaded '.$addedcontact.' contact(s)'
            ]);

        } 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', $addedcontact. ' contact(s) was successfully added to '.$group->name);
        return redirect()->route('esme.addressbook.contacts', ['group_id'=>$group_id]);
    }

    public function getAllContact(Request $request, ResellerContactdataTable $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('esme.address_book.contacts.index', ['group'=>$group]);
    }

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

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

        $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));
        }
        $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('esme.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'
        ]);

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

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

        $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!'));
        }

        $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('esme.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('esme.addressbook.contacts', ['group_id'=>$group_id]);
    }
}
