<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Produto;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;

use DB;

class AppController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api');
    }

    public function listPools(Request $request){
        //return abort(401);
        $user = auth('api')->user();

        $tipoPiscineiro = auth('api')->user()->checkRole('PISCINEIRO');
        $tipoProprietario = auth('api')->user()->checkRole('PROPRIETARIO');

        $tipo = null;

        $pools = [];

        if($tipoPiscineiro){
            $tipo = 'PISCINEIRO';
            $pools = $user->poolsPiscineiro;
        }else if($tipoProprietario){
            $tipo = 'PROPRIETARIO';
            $pools = $user->poolsProprietario;
        }



        $list = [];

        foreach($pools as $pool){

            $endereco = (
                $pool->address()->count() > 0 ?
                $pool->address[0]->logradouro . ', ' . $pool->address[0]->numero . ' ' .
                $pool->address[0]->complemento . ' - ' . $pool->address[0]->bairro . ' - ' .
                $pool->address[0]->cidade . ' - ' . $pool->address[0]->estado . ' - ' . $pool->address[0]->cep
                : ''
            );

            $list[] = [
                'piscinaId' => $pool->uuid,
                'nomePiscina' => $pool->nome_piscina,
                'volume' => $pool->volume,
                'timer' => $pool->timer,
                'tamanho_filtro' => $pool->tamanho_filtro,
                'contato' => $pool->contato,
                'observacao' => $pool->observacao,
                'revestimento' => $pool->revestimento,
                'marca_filtro' => $pool->marca_filtro,
                'tratamento' => $pool->tratamento,
                'proprietarioNome' => $pool->proprietario->name,
                'piscineiroNome' => $pool->user->name,
                'endereco' => $endereco,

            ];
        }

        if($tipo !== null){
            return response()->json(['success'=>true, 'pools'=>$list, 'tipoUsuario'=>$tipo]);
        }else{
            return response()->json(['success'=>false,'pools'=>null, 'tipoUsuario'=>null]);
        }
    }

    /*public function listPiscinas(Request $request){
        //return abort(401);
        $user = auth('api')->user();

        $tipoPiscineiro = auth()->user()->checkRole('PISCINEIRO');
        $tipoProprietario = auth()->user()->checkRole('PROPRIETARIO');

        $tipo = null;

        $pools = [];

        if($tipoPiscineiro){
            $tipo = 1;
            $pools = $user->poolsPiscineiro;
        }else if($tipoProprietario){
            $tipo = 2;
            $pools = $user->poolsProprietario;
        }



        $list = [];

        foreach($pools as $pool){
            $endereco = (
                $pool->address()->count() > 0 ?
                $pool->address[0]->logradouro . ', ' . $pool->address[0]->numero . ' ' .
                $pool->address[0]->complemento . ' - ' . $pool->address[0]->bairro . ' - ' .
                $pool->address[0]->cidade . ' - ' . $pool->address[0]->estado . ' - ' . $pool->address[0]->cep
                : ''
            );

            $list[] = [
                'id' => $pool->id,
                'piscinaId' => $pool->uuid,
                'nomePiscina' => $pool->nome_piscina,
                'volume' => $pool->volume,
                'timer' => $pool->timer,
                'tamanho_filtro' => $pool->tamanho_filtro,
                'contato' => $pool->contato ?? $pool->proprietario->name,
                'observacao' => $pool->observacao,
                'revestimento' => ['descricao'=>$pool->revestimento],
                'marca_filtro' => $pool->marca_filtro,
                'tratamento' => $pool->tratamento,
                'proprietarioNome' => $pool->proprietario->name,
                'piscineiroNome' => $pool->user->name,
                'logradouro' => $endereco,

            ];
        }

        if($tipo !== null){
            //return response()->json(['success'=>true, 'pools'=>$list, 'tipoUsuario'=>$tipo]);
            return response()->json(['success'=>true, 'content'=>$list, 'tipoUsuario'=>$tipo]);
        }else{
            return response()->json(['success'=>false,'pools'=>null, 'tipoUsuario'=>null]);
        }
    }

    public function getPiscina(Request $request, $id){
        $pool = \App\Models\Pool::find($id);
        $pool->timer = $pool->timer == 'SIM' ? 1 : 0;
        $pool->revestimento = ['descricao'=>$pool->revestimento];
        $pool->marcafiltro = ['descricao'=>$pool->marca_filtro];
        $pool->tratamento = ['descricao'=>$pool->tratamento];
        $pool->tamanhoFiltro = $pool->tamanho_filtro;
        return response()->json($pool);
    }*/

    public function listProdutos(Request $request){
        return response()->json(['produtos'=>Produto::where('company_id', auth('api')->user()->companies[0]->id)->get()]);
    }

    public function listAvisos(Request $request){
        $tipoProprietario = auth('api')->user()->checkRole('PROPRIETARIO');

        $notices = null;

        if($tipoProprietario){
            $notices = \App\Models\Notice::select(['notices.*', 'users.name as proprietario'])
                    ->join('servicos', 'servicos.id', 'notices.servico_id')
                    ->join('pools', 'pools.id', 'servicos.pool_id')
                    ->join('users', 'users.id', 'pools.proprietario_id')
                    ->where('pools.company_id', auth()->user()->companies[0]->id)
                    ->whereNull('parent_id')
                    /*->withCount(['notices' => function($q){
                        $q->where('notices.parent_id', 'notices.id');
                    }])*/
                    ->orderBy('notices.id', 'desc')
                    ->paginate(10);
        }else{
            $notices = \App\Models\Notice::select(['notices.*', 'users.name as proprietario'])
                    ->join('servicos', 'servicos.id', 'notices.servico_id')
                    ->join('pools', 'pools.id', 'servicos.pool_id')
                    ->join('users', 'users.id', 'pools.proprietario_id')
                    ->where('pools.company_id', auth()->user()->companies[0]->id)
                    ->whereNull('parent_id')
                    /*->withCount(['notices' => function($q){
                        $q->where('notices.parent_id', 'notices.id');
                    }])*/
                    ->orderBy('notices.id', 'desc')
                    ->paginate(10);
        }
        return response()->json(['avisos'=>$notices]);
    }

    public function getAviso(Request $request){
        $notice = \App\Models\Notice::where('servico_id',$request->id)->get();

        return response()->json(['aviso'=>$notice]);
    }

    public function finalizarServico(Request $request){
        try{
            // adicionar validacoes

            $outros = $request->input('outros');

            $servico = [];
            $servico['ph'] = $request->input('ph');
            $servico['temperatura'] = $request->input('temperatura');
            $servico['cloro'] = $request->input('cloro');

            $servico['aspiracao'] = !isset($outros['aspiracao']) ? 0 : 1;
            $servico['escovacao'] = !isset($outros['escovacao']) ? 0 : 1;
            $servico['limpeza_pre_filtro'] = !isset($outros['limpezaprefiltro']) ? 0 : 1;
            $servico['limpeza_elemento'] = !isset($outros['limpezaelemento']) ? 0 : 1;
            $servico['limpeza_bordas'] = !isset($outros['limpezabordas']) ? 0 : 1;
            $servico['dureza_calcica'] = !isset($outros['durezacalcica']) ? 0 : 1;
            $servico['acido_cianurico'] = !isset($outros['acidocianulico']) ? 0 : 1;
            $servico['alcalinidade_total'] = !isset($outros['alcalinidade']) ? 0 : 1;
            $servico['aspiracao_drenando'] = !isset($outros['aspiracao_drenando']) ? 0 : 1;
            $servico['limpeza_capa'] = !isset($outros['limpeza_capa']) ? 0 : 1;
            $servico['piscina_fuligem'] = !isset($outros['piscina_fuligem']) ? 0 : 1;
            $servico['piscina_grama'] = !isset($outros['piscina_grama']) ? 0 : 1;
            $servico['decantacao'] = !isset($outros['decantacao']) ? 0 : 1;
            $servico['peneiramento'] = !isset($outros['peneiramento']) ? 0 : 1;
            $servico['uuid'] = \Illuminate\Support\Str::uuid();
            $servico['user_id'] = auth()->user()->id;
            $servico['data_servico'] = date('Y-m-d');

            $pool = \App\Models\Pool::where('uuid', $request->input('pool_id'))->first();
            $servico['pool_id'] = $pool->id;

            $servico = \App\Models\Servico::create($servico);

            $aviso = $request->input('aviso');

            if($aviso !== null){
                $aviso = \App\Models\Notice::create([
                    'mensagem'=> $aviso['mensagem'],
                    'servico_id'=> $servico->id,
                    'user_id'=> auth('api')->user()->id,
                    'enviar_adm' => $aviso['enviarAdm'],
                    'enviar_proprietario' => $aviso['enviarProp'],
                    'tipo' => 0,
                    'situacao' => 1,
                    'enviado' => 0,
                ]);
            }

            $solicitacoes = $request->input('solicitados');

            if($solicitacoes !== null){
                $sol = [];

                foreach($solicitacoes as $key => $value){
                    $sol[$key]['quantidade'] = $solicitacoes[$key]['quantidade'];
                    $sol[$key]['produto_uuid'] = $solicitacoes[$key]['uuid'];
                    $sol[$key]['produto_descricao'] = $solicitacoes[$key]['descricao'] . ' ' . $solicitacoes[$key]['marca'];
                    $sol[$key]['valor_unitario'] = $solicitacoes[$key]['valor_unitario'];
                    $sol[$key]['pool_id'] = $pool->id;
                    $sol[$key]['servico_id'] = $servico->id;
                    $sol[$key]['created_at'] = date('Y-m-d H:i:s');
                    $sol[$key]['updated_at'] = date('Y-m-d H:i:s');
                }
                $solicitacoes = \App\Models\Solicitacao::insert($sol);
            }

            $utilizados = $request->input('utilizados');

            if($utilizados !== null){
                $util = [];

                foreach($utilizados as $key => $value){
                    $util[$key]['quantidade'] = $utilizados[$key]['quantidade'];
                    $util[$key]['produto_uuid'] = $utilizados[$key]['uuid'];
                    $util[$key]['produto_descricao'] = $utilizados[$key]['descricao'] . ' ' . $utilizados[$key]['marca'];
                    $util[$key]['valor_unitario'] = $utilizados[$key]['valor_unitario'];
                    $util[$key]['pool_id'] = $pool->id;
                    $util[$key]['servico_id'] = $servico->id;
                    $util[$key]['created_at'] = date('Y-m-d H:i:s');
                    $util[$key]['updated_at'] = date('Y-m-d H:i:s');
                }
                $utilizados = \App\Models\ProdutoUtilizado::insert($util);
            }

            return response()->json(['success'=>true, 'errorMessage'=>'', 'servico'=>$servico->uuid], 200);
        }catch(\Exception $e){
            Log::error("Erro: ".json_encode($request->all()));
            Log::error($e);
            return response()->json(['success'=>false, 'errorMessage'=>'Ocorreu um erro ao finalizar serviço!'], 400);
        }


    }

    public function uploadImagemServico(Request $request){
        $servicoUUID = $request->input('servico');

        $servico = \App\Models\Servico::where('uuid',$servicoUUID)->first();

        try{
            if(request()->hasFile('file')){
                $path = 'servicos/'.$servico->pool->id . '/';
                $imgName = uniqid();
                $pathFull = $path . $imgName;

                \App\Models\MediaFiles::create([
                    'uuid' => Str::uuid(),
                    'object_type' => 'SERVICO',
                    'object_id' => $servico->id,
                    'url_path' => $path,
                    'image_name' => $imgName,
                    'image_ext' => 'jpg',
                ]);
                $path = request()->file('file')->storePubliclyAs(
                    $path , $imgName .'.jpg', 'public'
                );
                return response()->json(['success'=>true, 'errorMessage'=>''], 200);
            }
            return response()->json(['success'=>false, 'errorMessage'=>'Objeto invalido!'], 200);
        }catch(\Exception $e){
            Log::error("Imagem servico: ".$request->input('servico'));
            Log::error($e);
            return response()->json(['success'=>false, 'errorMessage'=>'Ocorreu salvar a imagem!'], 400);
        }
    }

    public function listagemSolicitacoes(Request $request){
        $servicos = [];

        if(auth()->user()->checkRole('PISCINEIRO')){
            $servicos = \App\Models\Servico::where('user_id', auth()->user()->id)
                //->with(['solicitados', 'user', 'pool'])
                ->has('solicitados')
                ->with(['solicitados', 'user', 'pool'])
                ->orderBy('id', 'desc')
                ->get();
        }else if(auth()->user()->checkRole('PROPRIETARIO')){
            $servicos = \App\Models\Servico::select('servicos.*')
                ->join('pools', function($join){
                    $join->on('pools.proprietario_id', '=', DB::raw(auth()->user()->id));
                })
                //->with(['solicitados', 'user', 'pool'])
                ->has('solicitados')
                ->with(['solicitados', 'user', 'pool'])
                ->orderBy('servicos.id', 'desc')
                ->get();
        }



        return response()->json(['success'=>true,
                'data' => $servicos, 'tipoUsuario'=>auth()->user()->checkRole('PISCINEIRO') ? 'PISCINEIRO' : 'PROPRIETARIO'
            ], 200);
    }

    public function sendPagamento(){
        $items = [];

        $items['items'][] = [
            'amount' => '',
            'description'=> '',
            'quantity'=> '',
            'code'=> ''
        ];

        $customer = [];
        $customer['customer'] = [
            'name'=>'',
            'type'=>'individual',
            'email'=>'',
            'code'=>'',
            'document'=>'',
            'document_type'=>'CPF'
        ];

        $payments = [];
        $payments['payments'] = [
            'credit_card'=>[
                'card'=>[
                    "number"=> "",
                    "holder_name"=> "",
                    "holder_document"=> "",
                    "exp_month"=> '',
                    "exp_year"=> '',
                    "cvv"=> ""
                ],
                "operation_type"=> "auth_only",
                "installments"=> 1,
                "statement_descriptor"=> "Poolloop"
            ],
            'payment_method'=>'credit_card',
            'amount'=>0
        ];

        $order[] = $items;
        $order[] = $customer;
        $order[] = $payments;

        try{
            $responseOrder = \App\Services::sendOrders($order);
        }catch(\Exception $e){
            Log::error($e);
            return response()->json(['success'=>false, 'errorMessage'=>'Ocorreu um erro ao realizar o pagamento!'], 400);
        }
    }


    public function usuarioEmail(Request $request){
        $user = auth('api')->user();
        $role = \App\Models\RoleUser::where('user_id', auth('api')->user()->id)->first();
        $user->tipo = $role->role_id == 4 ? 1 : 2;
        return response()->json($user);
    }
}
