<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\UnidadesRequest;
use App\Models\Unidade;
use App\Models\Endereco;
use App\Models\Structure;
use App\Helpers\FileUploadHelper;

class UnidadesDeSaudeController extends Controller {

    public function __construct() {
        $this->middleware('unidadesSaude');
    }

    public function index(Request $request) {

        $paginate = 20;
        if (isset($request->q)) {
            $request->validate([
                'q' => 'nullable|string|max:255',
            ]);
            $unidadesSaude = Unidade::select('unidades_saude.*')
                    ->join('enderecos', 'enderecos.owner_id', '=', 'unidades_saude.id')
                    ->where(function ($query) use ($request) {
                        $q = trim($request->q);
                        $query->where('unidades_saude.nome', 'like', "%{$q}%")
                        ->orWhere('unidades_saude.telefone', 'like', "%{$q}%")
                        ->orWhere('unidades_saude.email', 'like', "%{$q}%")
                        ->orWhere('enderecos.cep', 'like', "%{$q}%")
                        ->orWhere('enderecos.logradouro', 'like', "%{$q}%")
                        ->orWhere('enderecos.complemento', 'like', "%{$q}%")
                        ->orWhere('enderecos.bairro', 'like', "%{$q}%");
                    })
                    ->orderByDesc('unidades_saude.created_at')
                    ->paginate($paginate);
        } else {
            $unidadesSaude = Unidade::orderBy("created_at", "asc")->paginate($paginate);
        }

        return view("admin.unidadesSaude.index", [
            "unidadesSaude" => $unidadesSaude,
        ]);
    }

    public function create() {
        return view("admin.unidadesSaude.create", [
            "secretarias" => Structure::select("id", "name", "abbreviation")
                    ->where([
                        ["status", "=", "ATIVADO"],
                        ["name", "like", "%saúde%"],
                    ])
                    ->whereNull("structure_id")
                    ->orderBy('name', 'asc')
                    ->get()
        ]);
    }

    public function store(UnidadesRequest $request) {

        $unidade_saude_array = [
            "structure_id" => $request->structure_id,
            "tipoUnidadeSaude" => $request->tipoUnidadeSaude,
            "nome" => $request->nome,
            "telefone" => $request->telefone ??= null,
            "email" => $request->email ??= null,
            "informacoes" => $request->informacoes,
            "status" => $request->status,
        ];

        $endereco = [
            "domicilio" => $request->domicilio,
            "latitude" => $request->latitude,
            "longitude" => $request->longitude,
            "cep" => $request->cep,
            "logradouro" => $request->logradouro,
            "numero" => $request->numero,
            "complemento" => $request->complemento,
            "cidade" => $request->cidade,
            "bairro" => $request->bairro,
            "map" => $request->map,
            "uf" => $request->uf,
        ];

        $path = "pmar/assets/img/icons/unidade_saude.png";
        if ($request->hasFile('foto') && $request->file('foto')->isValid()) {
            $file = $request->file('foto');
            $uploadedPath = FileUploadHelper::processSafeImageUpload($file, 'unidades');

            if ($uploadedPath) {
                $path = $uploadedPath;
            }
        }

        $unidade_saude_array["foto"] = $path;

        try {
            DB::beginTransaction();

            $unidadeSaude = Unidade::create($unidade_saude_array);

            $endereco['user_id'] = Auth::user()->id;
            $endereco['owner_id'] = $unidadeSaude->id;

            Endereco::create($endereco);

            DB::commit();

            $page = $request->input('page', 1);
            return redirect("/admin/unidades-de-saude?page={$page}")->with("success", __("* A unidade de saúde {$request->nome} foi cadastrada com sucesso!"));
        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()
                            ->back()
                            ->withInput()
                            ->with('error', 'Erro tentar cadastrar esta unidade de saúde. ' . $e->getMessage());
        }
    }

    public function edit(Unidade $unidade) {

        return view("admin.unidadesSaude.edit", [
            "unidade" => $unidade,
            "secretarias" => Structure::select("id", "name", "abbreviation")
                    ->where([
                        ["status", "=", "ATIVADO"],
                        ["name", "like", "%saúde%"],
                    ])
                    ->whereNull("structure_id")
                    ->orderBy('name', 'asc')
                    ->get()
        ]);
    }

    public function update(UnidadesRequest $request, Unidade $unidade) {

        $unidade_saude_array = [
            "structure_id" => $request->structure_id,
            "tipoUnidadeSaude" => $request->tipoUnidadeSaude,
            "nome" => $request->nome,
            "telefone" => $request->telefone ??= null,
            "email" => $request->email ??= null,
            "informacoes" => $request->informacoes,
            "status" => $request->status,
        ];

        $endereco = [
            "domicilio" => $request->domicilio,
            "latitude" => $request->latitude,
            "longitude" => $request->longitude,
            "cep" => $request->cep,
            "logradouro" => $request->logradouro,
            "numero" => $request->numero,
            "complemento" => $request->complemento,
            "cidade" => $request->cidade,
            "bairro" => $request->bairro,
            "map" => $request->map,
            "uf" => $request->uf,
        ];

        $ds = DIRECTORY_SEPARATOR;
        $path = $unidade->foto;
        if ($request->hasFile('foto') && $request->file('foto')->isValid()) {

            $file = $request->file('foto');
            $uploadedPath = FileUploadHelper::processSafeImageUpload($file, 'unidades');

            if ($uploadedPath) {
                $path = $uploadedPath;
            }

            $search = "pmar{$ds}assets{$ds}img";
            $file_exist = storage_path() . str_replace($search, "{$ds}app{$ds}public", $unidade->foto);
            if (@file_exists($file_exist)) {
                unlink($file_exist);
            }
        }

        $unidade_saude_array["foto"] = $path;

        try {

            DB::beginTransaction();

            $unidade->update($unidade_saude_array);

            $endereco['user_id'] = Auth::user()->id;
            $endereco['owner_id'] = $unidade->id;

            $unidade->endereco->update($endereco);

            DB::commit();

            $page = $request->input('page', 1);
            return redirect("/admin/unidades-de-saude?page={$page}")->with("success", __("* A unidade de saude {$request->nome} foi atualizada com sucesso!"));
        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()
                            ->back()
                            ->withInput()
                            ->with('error', 'Erro tentar atualizar esta unidade de saude. ' . $e->getMessage());
        }
    }

    public function destroy(Request $request, Unidade $unidade) {

        if (!in_array("DELETE", explode(",", Auth::user()->papers))) {
            return redirect()
                            ->back()
                            ->withInput()
                            ->with('error', 'Permissão negada! Entre em contato com o administrador do sistema.');
        }

        $ds = DIRECTORY_SEPARATOR;

        if ($unidade->foto != "pmar/assets/img/icons/unidade_saude.png") {
            $search = "pmar{$ds}assets{$ds}img";
            $file_exist = storage_path() . str_replace($search, "{$ds}app{$ds}public", $unidade->foto);
            if (@file_exists($file_exist)) {
                unlink($file_exist);
            }
        }

        try {
            DB::beginTransaction();
            Endereco::destroy($unidade->endereco->id);
            Unidade::destroy($unidade->id);
            DB::commit();

            $page = $request->input('page', 1);
            return redirect("/admin/unidades-de-saude?page={$page}")->with("success", __("* A unidade de saude {$unidade->nome} foi excluída com sucesso! Esta ação não pode ser desfeita!"));
        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()
                            ->back()
                            ->withInput()
                            ->with('error', 'Erro tentar excluir esta unidade de saude. ' . $e->getMessage());
        }
    }

    public function status(Request $request, Unidade $unidade) {
        try {
            DB::beginTransaction();
            $unidade->fill([
                'status' => $request->checkStatus
            ]);
            $unidade->save();
            DB::commit();

            $page = $request->input('page', 1);
            return redirect("/admin/unidades-de-saude?page={$page}")->with("success", __("* O status da unidade de saude {$unidade->nome} foi alterado com sucesso!"));
        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()
                            ->back()
                            ->withInput()
                            ->with('error', 'Erro ao tentar alterar o status desta unidade de saude. ' . $e->getMessage());
        }
    }
}
