<?php

namespace App\Http\Controllers;

use App\Models\Biene;
use App\Models\Empleado;
use App\Models\Categoria;
use App\Models\Dependencia;
use App\Models\CentroTrabajo;
use App\Models\Proveedore;
use App\Models\Situacion;
use App\Models\Estatus;
use App\Models\Conservacion;
use App\Models\Partidas;
use App\Models\categorias_partidas;
use App\Http\Requests\BieneRequest;
use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf;
use App\Exports\bieneExport;
use App\Models\TipoBiene;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\DB;
use SimpleSoftwareIO\QrCode\Facades\QrCode;


/**
 * Class BieneController
 * @package App\Http\Controllers
 */
class BieneController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function exportExcel()
    {
        return Excel::download(new bieneExport, 'Reporte_General_Bienes.xlsx');
    }


    public function index(Request $request)
    {
        $dependencias = Dependencia::with('centrosTrabajos')->get();
        $centrosTrabajoAgrupados = CentroTrabajo::with('dependencia')->get()->groupBy('dependencia_id');
        $query = Biene::query();
    
        if ($request->filled('bien')) {
            $query->where('bien', 'like', '%' . $request->bien . '%');
        }
    
        if ($request->filled('nombre') || $request->filled('apellidoPaterno')) {
            $query->whereHas('empleado', function ($q) use ($request) {
                if ($request->filled('nombre')) {
                    $q->where('nombre', 'like', '%' . $request->nombre . '%');
                }
                if ($request->filled('apellidoPaterno')) {
                    $q->where('apellidoPaterno', 'like', '%' . $request->apellidoPaterno . '%');
                }
            });
        }
    
        if ($request->filled('centro_trabajo_id')) {
            $query->where('centro_trabajo_id', $request->centro_trabajo_id);
        }
    
        $bienes = $query->paginate(10)->appends($request->except('page'));

        $dependencias = Dependencia::with('centrosTrabajos')->get();
    
        return view('biene.index', compact('bienes', 'dependencias'))
            ->with('i', (request()->input('page', 1) - 1) * 10);
    }



    public function create()
    {
        $biene = new Biene();
        $biene->inventario = Biene::getNextClave();
        $categorias = Categoria::pluck('nombre', 'id');
        $estatus = Estatus::pluck('estatus', 'id');
        $situacion = Situacion::pluck('situacion', 'id');
        $tipoBien = TipoBiene::pluck('tipo', 'id');
        $conservacion = Conservacion::pluck('conservacion', 'id');
        $dependencias = Dependencia::with('centrosTrabajos')->get();
        $centrosTrabajoAgrupados = CentroTrabajo::with('dependencia')->get()->groupBy('dependencia_id');

        // Carga las partidas con sus categorías
        $partidas = Partidas::with('categorias_partidas')->get();

        $proveedores = Proveedore::with('facturas')->get();

        return view('biene.create', compact(
            'biene',
            'categorias',
            'dependencias',
            'situacion',
            'tipoBien',
            'conservacion',
            'estatus',
            'centrosTrabajoAgrupados',
            'partidas',
            'proveedores'
        ));
    }
    public function edit($id)
    {
        $biene = Biene::find($id);
        $empleado = $biene->empleado; // Obtener el empleado asignado al bien
        $todosEmpleados = Empleado::all(); // Obtener todos los empleados
        $estatus = Estatus::pluck('estatus', 'id');
        $tipoBien = TipoBiene::pluck('tipo', 'id');
        $categorias = Categoria::pluck('nombre', 'id');
        $dependencias = Dependencia::with('centrosTrabajos')->get();
        $selectedCentroTrabajoId = $biene->centro_trabajo_id; // Obtener el ID del centro de trabajo seleccionado
        $situacion = Situacion::pluck('situacion', 'id');
        $conservacion = Conservacion::pluck('conservacion', 'id');
        $proveedores = Proveedore::with('facturas')->get();
        $partidas = Partidas::with('categorias_partidas')->get();
        $selectedFacturaId = $biene->factura_id; // Obtener el ID de la factura seleccionada

        return view('biene.edit', compact('biene', 'empleado', 'partidas', 'todosEmpleados', 'tipoBien', 'situacion', 'conservacion', 'estatus', 'categorias', 'dependencias', 'selectedCentroTrabajoId', 'proveedores', 'selectedFacturaId'));
    }
    /**
     * Store a newly created resource in storage.
     */
    public function store(BieneRequest $request)
    {
        // dd();
        Biene::create($request->validated());

        return redirect()->route('bienes.index')
            ->with('success', 'Biene created successfully.');
    }

    /** 
     * Display the specified resource.
     */
    public function show($id)
    {
        $biene = Biene::findOrFail($id);
        $empleado = $biene->empleado;
        // $todosEmpleados = Empleado::all(); // Agregar esta línea
        return view('biene.show', compact('biene', 'empleado'));
    }
    /**
     * Show the form for editing the specified resource.
     */


    /**
     * Update the specified resource in storage.
     */
    public function update(BieneRequest $request, Biene $biene)
    {

        $biene->update($request->validated());

        return redirect()->route('bienes.index')
            ->with('success', 'Biene updated successfully');
    }

    public function destroy($id)
    {
        Biene::find($id)->delete();

        return redirect()->route('bienes.index')
            ->with('success', 'Biene deleted successfully');
    }



    public function asignarBien(Request $request, $bienId)
    {
        $empleadoId = $request->input('empleado_id');
        // Verifica que se haya seleccionado un empleado
        if ($empleadoId) {
            $biene = Biene::findOrFail($bienId);
            $empleado = Empleado::findOrFail($empleadoId);
            // Realiza la asignación del bien al empleado
            $biene->empleado()->associate($empleado);
            $biene->save();
            // Redirecciona a la vista 'biene.disponible' después de la asignación
            return redirect()->route('disponible')->with('success', 'Bien asignado correctamente.');
        }
        return redirect()->back()->with('error', 'Debe seleccionar un empleado.');
    }

    public function transferirBien(Request $request, $bienId)
    {
        $nuevoEmpleadoId = $request->input('nuevo_empleado_id');
        // Verifica que se haya seleccionado un nuevo empleado
        if ($nuevoEmpleadoId) {
            $biene = Biene::findOrFail($bienId);
            $nuevoEmpleado = Empleado::findOrFail($nuevoEmpleadoId);

            // Guarda el ID y nombre del empleado anterior para el mensaje
            $anteriorEmpleado = $biene->empleado;
            $anteriorEmpleadoNombre = $anteriorEmpleado ? $anteriorEmpleado->nombre : 'ninguno';

            // Transfiere el bien al nuevo empleado
            $biene->empleado()->associate($nuevoEmpleado);
            $biene->save();

            // Redirecciona con un mensaje de éxito
            return redirect()->route('bienes.show', $bienId)
                ->with('success', "Bien transferido correctamente del empleado {$anteriorEmpleadoNombre} al empleado {$nuevoEmpleado->nombre}.");
        }

        // Si no se seleccionó nuevo empleado, vuelve atrás con un mensaje de error
        return redirect()->back()->with('error', 'Debe seleccionar un nuevo empleado.');
    }


    public function mostrarAsignacion($id)
    {
        // Encontrar el bien a asignar
        $bien = Biene::findOrFail($id);

        // Obtener la lista de empleados
        $empleados = Empleado::all();

        // Retornar la vista con los datos necesarios
        return view('biene.asignacion', [
            'bien' => $bien,
            'empleados' => $empleados,
        ]);
    }
    public function showAvailableItems()
    {
        $bienes = Biene::whereNull('empleado_id')->paginate(10); 
        return view('biene.disponible', compact('bienes'));
    }

    public function generarEtiqueta($id)
    {
        $biene = Biene::findOrFail($id);

        // Obtén la ruta de la imagen
        $logoPath = public_path('images/logo.png');

        // Convierte la imagen a base64
        $logoBase64 = base64_encode(file_get_contents($logoPath));

        // Configura el tamaño de la etiqueta y elimina los márgenes
        $pdf = PDF::loadView('biene.etiqueta', compact('biene', 'logoBase64'))
            ->setPaper([0, 0, 140.472, 70.236], 'portrait');

        // Muestra el PDF en el navegador
        return $pdf->stream('etiqueta_' . $biene->id . '.pdf', ['Attachment' => false]);
    }
    public function duplicate(Request $request, $id)
    {
        $request->validate([
            'cantidad' => 'required|integer|min:1|max:100',
        ]);

        $original = Biene::findOrFail($id);
        $cantidad = $request->input('cantidad');

        DB::beginTransaction();

        try {
            for ($i = 0; $i < $cantidad; $i++) {
                $nuevo = $original->replicate();
                $nuevo->inventario = Biene::getNextClave();
                $nuevo->save();
            }

            DB::commit();
            return redirect()->route('bienes.index')->with('success', "Se han duplicado $cantidad bienes exitosamente.");
        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->back()->with('error', 'Ocurrió un error al duplicar los bienes: ' . $e->getMessage());
        }
    }
}
