<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Models\Setor;
use App\Models\Protocolo;
use Illuminate\Http\Request;
use App\Mail\NotificacaoMail;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\SetorController;
use App\Notifications\TelegramNotification;
use Exception;
use phpDocumentor\Reflection\Types\Integer;
use Illuminate\Foundation\Auth\User as AuthUser;

class UserController extends Controller
{
    public function __construct()
    {
        //$this->middleware('auth');
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */


    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */



    public function createSolicitante()
    {
        return view('solicitante.create');
    }

    public function createFuncionario()
    {
        //somente cadastradores podem ver esta tela
        if (Auth::user()->nivel != 1) {
            return redirect()->route('login');
        }

        $sC = new SetorController();
        $setores = $sC->imprimeArvoreWrapper();
        return view('funcionario.create', compact('setores'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $nivel = $request->nivel;
        if ($nivel == 1) {
            return $this->storeFuncionario($request);
        } else {
            return $this->storeSolicitante($request);
        }
    }

    public function apenasNumeros($string)
    {
        return preg_replace("/[^0-9]/", "", $string);
    }

    public function storeSolicitante(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|unique:users,email',
            'password' => 'required',
            'cpf' => 'required|unique:users_solicitantes,cpf',
            'cep' => 'required',
            'logradouro' => 'required',
            'bairro' => 'required',
            'cidade' => 'required',
            'uf' => 'required',
            'pais' => 'required',
            'pessoaFisica' => 'required'
        ]);

        $requestData = $request->all();
        $dadosUser['name'] = $requestData['name'];
        $dadosUser['email'] = $requestData['email'];
        $dadosUser['notificarEmail'] = false; //$request->has('notificarEmail');
        $dadosUser['notificarTelegram'] = $request->has('notificarTelegram');
        $dadosUser['password'] = Hash::make($requestData['password']);
        $dadosUser['idTelegram'] = $requestData['idTelegram'];
        $dadosUser['nivel'] = 3;

        try {
            $user = User::create($dadosUser);
            $user_solicitante = DB::table('users_solicitantes')->insert([
                'idUser' => $user->id,
                'cep' => $requestData['cep'],
                'cpf' => $this->apenasNumeros($requestData['cpf']),
                'logradouro' => $requestData['logradouro'],
                'bairro' => $requestData['bairro'],
                'cidade' => $requestData['cidade'],
                'uf' => $requestData['uf'],
                'pais' => $requestData['pais'],
                'pessoaFisica' => ($requestData['pessoaFisica'] == 'true')
            ]);
        } catch (Exception $e) {

            return back()->withErrors(['cpf' => 'O CPF/CNPJ fornecido já existe em nossa base de dados.']);
        }
        if ($user->notificarEmail) {
            //Mail::send(new NotificacaoMail($user, 'recebemosSolicitacao'));
        }

        if ($user->notificarTelegram) {
            $user->notify(new TelegramNotification(TelegramNotification::BOAS_VINDAS));
        }

        return redirect('/login')->with('flash_message', 'Seu cadastro foi realizado com sucesso!');
    }

    public function storeFuncionario(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|unique:users,email',
            'password' => 'required',
            'idTelegram' => 'required',
            'nivel' => 'required',
            'cpf' => 'required|unique:users_funcionarios,cpf',
            'matricula' => 'required',
            'idSetor' => 'required',
            'cargo' => 'required'
        ]);

        $requestData = $request->all();
        $dadosUser['name'] = $requestData['name'];
        $dadosUser['email'] = $requestData['email'];
        $dadosUser['notificarEmail'] = ($requestData['notificarEmail'] == 'true');
        $dadosUser['notificarTelegram'] = ($requestData['notificarTelegram'] == 'true');
        $dadosUser['password'] = Hash::make($requestData['password']);
        $dadosUser['idTelegram'] = $requestData['idTelegram'];
        $dadosUser['nivel'] = $requestData['nivel'];

        $user = User::create($dadosUser);

        $valor = intval(trim($requestData['idSetor'], "'"));

        $user_funcionario = DB::table('users_funcionarios')->insert([
            'idUser' => $user->id,
            'cpf' => $this->apenasNumeros($requestData['cpf']),
            'matricula' => $requestData['matricula'],
            'idSetor' => $valor,
            'cargo' => $requestData['cargo']
        ]);

        return redirect('/funcionario/index')->with('flash_message', 'Bem-vindo!');
    }

    public function storeAnonimo($requestData)
    {
        $telefone =  $this->soNumeros($requestData['telefone']);
        $user = User::create([
            'name' => 'anônimo',
            'telefone' => $telefone,
            'email' => '',
            'nivel' => 3,
            'password' => ''
        ]);

        return $user->id;
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Http\Response
     */
    public function show(User $user)
    {
        //
    }

    public function showFuncionario($id)
    {
        //somente cadastradores podem ver esta tela
        if (Auth::user()->nivel != 1) {
            return redirect()->route('login');
        }

        $funcionario = DB::table('users')
            ->select('users.*', 'users_funcionarios.cpf', 'users_funcionarios.cargo', 'users_funcionarios.matricula', 'users_funcionarios.idUser', 'users_funcionarios.idSetor',)
            ->join('users_funcionarios', 'users.id', '=', 'users_funcionarios.idUser')
            ->where('users.id', '=', $id)
            ->where('deleted_at', '=', NULL)
            ->get()[0];

        dd($funcionario);
        $funcionario->idSetor = Setor::findOrFail($funcionario->idSetor)->nome;

        return view('funcionario.show', compact('funcionario'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Http\Response
     */
    public function edit(User $user)
    {
        //
    }

    public function editFuncionario($id)
    {
        //somente cadastradores podem ver esta tela
        if (Auth::user()->nivel != 1) {
            return redirect()->route('login');
        }

        $funcionario = DB::table('users')->select('users.*', 'users_funcionarios.cpf', 'users_funcionarios.matricula', 'users_funcionarios.cargo', 'users_funcionarios.idUser', 'users_funcionarios.idSetor')
            ->leftJoin('users_funcionarios', 'users.id', '=', 'users_funcionarios.idUser')
            ->where('users.id', '=', $id)
            ->get()[0];

        $sC = new SetorController();
        $setores = $sC->imprimeArvoreWrapper();

        return view('funcionario.edit', compact('funcionario', 'setores'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\User  $user
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request)
    {
        $nivel = $request->nivel;
        if ($nivel == 1) {
            return $this->updateFuncionario($request);
        } else {
            return $this->updateSolicitante($request);
        }
    }

    public function updateSolicitante(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required',
            'password' => 'required',
            'cep' => 'required',
            'logradouro' => 'required',
            'bairro' => 'required',
            'cidade' => 'required',
            'uf' => 'required',
            'pessoaFisica' => 'required'
        ]);

        $requestData = $request->all();
        $dadosUser['name'] = $requestData['name'];
        $dadosUser['email'] = $requestData['email'];
        $dadosUser['password'] = $requestData['password'];
        $dadosUser['idTelegram'] = $requestData['idTelegram'];
        $dadosUser['nivel'] = $requestData['nivel'];

        $user = User::findOrFail($requestData['id']);

        $user->update($dadosUser);
        $user_solicitante = DB::table('users_solicitantes')->update([
            'idUser' => $user->id,
            'cpf' => $requestData['cpf'],
            'cep' => $requestData['cep'],
            'logradouro' => $requestData['logradouro'],
            'bairro' => $requestData['bairro'],
            'cidade' => $requestData['cidade'],
            'uf' => $requestData['uf'],
            'pessoaFisica' => $requestData['pessoaFisica']
        ]);

        return view('solicitante.index');
    }

    public function updateFuncionario(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|unique:users,email,' . $request->id,
            'idTelegram' => 'required',
            'nivel' => 'required',
            'cpf' => 'required',
            'matricula' => 'required',
            'idSetor' => 'required',
            'cargo' => 'required'
        ]);

        $requestData = $request->all();

        $user = User::findOrFail($requestData['id']);

        if ($requestData['email'] != $user->email) {
            $dadosUser['email'] = $requestData['email'];
        }
        if ($requestData['password'] != "") {
            $dadosUser['password'] = Hash::make($requestData['password']);
        }

        $dadosUser['name'] = $requestData['name'];
        $dadosUser['idTelegram'] = $requestData['idTelegram'];
        $dadosUser['nivel'] = $requestData['nivel'];

        $user->update($dadosUser);
        $user_funcionario = DB::table('users_funcionarios')
            ->where('idUser', '=', $user->id)
            ->update([
                'cpf' => $requestData['cpf'],
                'matricula' => $requestData['matricula'],
                'idSetor' => intval(trim($requestData['idSetor'], "'")),
                'cargo' => $requestData['cargo']
            ]);

        return $this->indexFuncionario();
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  Integer $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        User::findOrFail($id)->delete();

        return $this->indexFuncionario();
    }

    public function destroyFuncionario($id)
    {
        User::findOrFail($id)->delete();

        return redirect()->back();
    }

    public function homeFuncionario()
    {
        //somente cadastradores podem ver esta tela
        if (Auth::user()->nivel != 2) {
            return redirect()->route('login');
        }

        $uf = DB::table('users_funcionarios')->select('idSetor')->where('idUser', '=', Auth::user()->id)->get();
        $protocolos = Protocolo::all()->where('idSetor', '=', $uf[0]->idSetor);

        return view('funcionario.home', compact('protocolos'));
    }

    public function homeCadastrador()
    {
        //somente cadastradores podem ver esta tela
        if (Auth::user()->nivel != 1) {
            return redirect()->route('login');
        }

        return  view('cadastrador.home');
    }

    public function indexFuncionario()
    {
        //somente cadastradores podem ver esta tela
        if (Auth::user()->nivel != 1) {
            return redirect()->route('login');
        }

        $funcionarios = DB::table('users')
            ->select('users.*', 'users_funcionarios.*', 'setors.nome')
            ->join('users_funcionarios', 'users.id', '=', 'users_funcionarios.idUser')
            ->join('setors', 'setors.id', '=', 'users_funcionarios.idSetor')
            ->where('users.deleted_at', '=', NULL)
            ->get();

        return view("funcionario.index", compact('funcionarios'));
    }

    public function solicitacoesFuncionario()
    {
        $protocolos = Protocolo::all();

        foreach ($protocolos as $protocolo) {
            $protocolo->idSetor = Setor::findOrFail($protocolo->idSetor)->nome;
        }

        return view("funcionario.funcionarioSolicitacoes", compact('protocolos'));
    }

    public function solicitacoesFuncionarioShow($id)
    {

        $protocolo = Protocolo::findOrFail($id);
        $protocolo->idSetor = Setor::findOrFail($id)->nome;
        $sC = new SetorController();
        $setores = $sC->imprimeArvoreWrapper();


        return view('funcionario.showDetalhes', compact('protocolo', 'setores'));
    }

    public function detalhesFuncionarios($id)
    {

        $funcionarios =  DB::table('users')
            ->join('users_funcionarios', 'users.id', '=', 'users_funcionarios.idUser')
            ->join('setors', 'setors.id', '=', 'users_funcionarios.idSetor')
            ->select('users.id as id', 'users.*', 'users_funcionarios.*', 'setors.nome')
            ->where('users.id', '=', $id)
            ->get();

        return view('funcionario.funcionarioDetalhesFun', compact('funcionarios'));
    }

    public function montarEditarFuncionario($id)
    {

        $funcionario = DB::table('users')
            ->join('users_funcionarios', 'users.id', '=', 'users_funcionarios.idUser')
            ->join('setors', 'setors.id', '=', 'users_funcionarios.idSetor')
            ->select('users.id as id', 'users.*', 'users_funcionarios.*', 'setors.nome')
            ->where('users.id', '=', $id)
            ->get();
        $sC = new SetorController();
        $setores = $sC->imprimeArvoreWrapper();


        return view('funcionario.editarFuncionario', compact('funcionario', 'setores'));
    }

    public function  soNumeros($string)
    {
        return preg_replace("/[^0-9]/", "", $string);
    }
}
