<?php

namespace App\Http\Controllers\Admin\helpdesk;

// controller
use App\Http\Controllers\Common\PhpMailController;
use App\Http\Controllers\Common\SettingsController;
use App\Http\Controllers\Controller;
// request
use App\Http\Requests\helpdesk\AgentRequest;
use App\Http\Requests\helpdesk\AgentUpdate;
// model
use App\Model\helpdesk\Agent\Assign_team_agent;
use App\Model\helpdesk\Agent\Department;
use App\Model\helpdesk\Agent\Groups;
use App\Model\helpdesk\Agent\Teams;
use App\Model\helpdesk\Email\Emails;
use App\Model\helpdesk\Settings\Company;
use App\Model\helpdesk\Settings\Email;
use App\Model\helpdesk\Utility\Timezones;
use App\User;
// classes
use DB;
use Exception;
use Hash;
use Mail;

/**
 * AgentController
 * This controller is used to CRUD category.
 *
 * @author      Ladybird <info@ladybirdweb.com>
 */
class AgentController extends Controller
{
    /**
     * Create a new controller instance.
     * constructor to check
     * 1. authentication
     * 2. user roles
     * 3. roles must be agent.
     *
     * @return void
     */
    public function __construct(PhpMailController $PhpMailController)
    {
        $this->PhpMailController = $PhpMailController;
        SettingsController::smtp();
        // checking authentication
        $this->middleware('auth');
        // checking admin roles
        $this->middleware('roles');
    }

    /**
     * Get all agent list page.
     *
     * @param type User $user
     *
     * @return type Response
     */
    public function index()
    {
        try {
            return view('themes.default1.admin.helpdesk.agent.agents.index');
        } catch (Exception $e) {
            return view('404');
        }
    }

    /**
     * creating a new agent.
     *
     * @param type Assign_team_agent $team_assign_agent
     * @param type Timezones         $timezone
     * @param type Groups            $group
     * @param type Department        $department
     * @param type Teams             $team
     *
     * @return type view
     */
    public function create(Assign_team_agent $team_assign_agent, Timezones $timezone, Groups $group, Department $department, Teams $team)
    {
        try {
            $team = $team->get();
            $timezones = $timezone->get();
            $groups = $group->get();
            $departments = $department->get();
            $teams = $team->lists('id', 'name');

            return view('themes.default1.admin.helpdesk.agent.agents.create', compact('assign', 'teams', 'agents', 'timezones', 'groups', 'departments', 'team'));
        } catch (Exception $e) {
            return redirect()->back()->with('fails', $e->errorInfo[2]);
        }
    }

    /**
     * store a new agent.
     *
     * @param type User              $user
     * @param type AgentRequest      $request
     * @param type Assign_team_agent $team_assign_agent
     *
     * @return type Response
     */
    public function store(User $user, AgentRequest $request, Assign_team_agent $team_assign_agent)
    {

        // dd($this->system_mail());

        /* Insert to user table */
        $user->role = 'agent';
        $user->fill($request->input())->save();
        $password = $this->generateRandomString();
        $user->password = Hash::make($password);
        $requests = $request->input('team_id');
        $id = $user->id;
        // insert team
        foreach ($requests as $req) {
            // DB::insert('insert into team_assign_agent (team_id, agent_id) values (?,?)', [$req, $id]);
        }
        /* Succes And Failure condition */
        if ($user->save() == true) {
            $name = $user->user_name;
            $email = $user->email;
            $system_from = $this->company();
            try {
                // send mail on registration
                $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => $name, 'email' => $email], $message = ['subject' => 'Password', 'scenario' => 'registration-notification'], $template_variables = ['user' => $name, 'email_address' => $email, 'user_password' => $password]);
            } catch (Exception $e) {
                return redirect('agents')->with('fails', 'Some error occured while sending mail to the agent. Please check email settings and try again');
            }

            return redirect('agents')->with('success', 'Agent Created sucessfully');
        } else {
            return redirect('agents')->with('fails', 'Agent can not Create');
        }
    }

    /**
     * Editing a selected agent.
     *
     * @param type int               $id
     * @param type User              $user
     * @param type Assign_team_agent $team_assign_agent
     * @param type Timezones         $timezone
     * @param type Groups            $group
     * @param type Department        $department
     * @param type Teams             $team
     *
     * @return type Response
     */
    public function edit($id, User $user, Assign_team_agent $team_assign_agent, Timezones $timezone, Groups $group, Department $department, Teams $team)
    {
        try {
            $user = $user->whereId($id)->first();
            $team = $team->get();
            $teams1 = $team->lists('name', 'id');
            $timezones = $timezone->get();
            $groups = $group->get();
            $departments = $department->get();
            $table = $team_assign_agent->where('agent_id', $id)->first();
            $teams = $team->lists('id', 'name');
            $assign = $team_assign_agent->where('agent_id', $id)->lists('team_id');

            return view('themes.default1.admin.helpdesk.agent.agents.edit', compact('teams', 'assign', 'table', 'teams1', 'selectedTeams', 'user', 'timezones', 'groups', 'departments', 'team', 'exp', 'counted'));
        } catch (Exception $e) {
            return redirect('agents')->with('fail', 'No such file');
        }
    }

    /**
     * Update the specified agent in storage.
     *
     * @param type int               $id
     * @param type User              $user
     * @param type AgentUpdate       $request
     * @param type Assign_team_agent $team_assign_agent
     *
     * @return type Response
     */
    public function update($id, User $user, AgentUpdate $request, Assign_team_agent $team_assign_agent)
    {

        // storing all the details
        $user = $user->whereId($id)->first();
        $daylight_save = $request->input('daylight_save');
        $limit_access = $request->input('limit_access');
        $directory_listing = $request->input('directory_listing');
        $vocation_mode = $request->input('vocation_mode');
        //==============================================
        $table = $team_assign_agent->where('agent_id', $id);
        $table->delete();
        $requests = $request->input('team_id');
        // inserting team details
        foreach ($requests as $req) {
            DB::insert('insert into team_assign_agent (team_id, agent_id) values (?,?)', [$req, $id]);
        }
        //Todo For success and failure conditions
        try {
            $user->fill($request->except('daylight_save', 'limit_access', 'directory_listing', 'vocation_mode', 'assign_team'))->save();

            return redirect('agents')->with('success', 'Agent Updated sucessfully');
        } catch (Exception $e) {
            return redirect('agents')->with('fails', 'Agent did not update'.'<li>'.$e->errorInfo[2].'</li>');
        }
    }

    /**
     * Remove the specified agent from storage.
     *
     * @param type int               $id
     * @param type User              $user
     * @param type Assign_team_agent $team_assign_agent
     *
     * @return type Response
     */
    public function destroy($id, User $user, Assign_team_agent $team_assign_agent)
    {
        /* Becouse of foreign key we delete team_assign_agent first */
        error_reporting(E_ALL & ~E_NOTICE);
        $team_assign_agent = $team_assign_agent->where('agent_id', $id);
        $team_assign_agent->delete();
        $user = $user->whereId($id)->first();
        try {
            $error = 'This staff is related to some tickets';
            $user->id;
            $user->delete();
            throw new \Exception($error);

            return redirect('agents')->with('success', 'Agent Deleted sucessfully');
        } catch (\Exception $e) {
            dd($e->errorInfo);

            return redirect('agents')->with('fails', $error);
        }
    }

    /**
     * Generate a random string for password.
     *
     * @param type $length
     *
     * @return type string
     */
    public function generateRandomString($length = 10)
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }

        return $randomString;
    }

    /**
     * Fetching comapny name to send mail.
     *
     * @return type
     */
    public function company()
    {
        $company = Company::Where('id', '=', '1')->first();
        if ($company->company_name == null) {
            $company = 'Support Center';
        } else {
            $company = $company->company_name;
        }

        return $company;
    }

    /*
     * System default email
     */
    //  public function system_mail() {
    //  	$emails = Emails::all();
    //  	$count_emails = $emails->count();
    //  	if($count_emails > 1) {
    // dd($emails);
    //  	}
    //      $email = Email::where('id', '=', '1')->first();
    //      return $email->sys_email;
    //  }
}
