<?php

namespace App\Http\Controllers\Backend\Payroll;

use App\Http\Controllers\Controller;
use App\Models\User;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

/**
 * Punto 2.5 — Gestión masiva de cuentas bancarias de empleados.
 *
 * Pantalla con tabla editable en vivo: cada fila tiene inputs para banco y
 * número de cuenta. Se guardan individualmente con AJAX o todos juntos
 * mediante "Guardar Todo".
 *
 * La cuenta vive en users.bank_name / users.bank_account (campos directos
 * en la tabla users, no en tabla bank_accounts).
 */
class EmployeeBankController extends Controller
{
    /**
     * Pantalla principal: tabla editable con todos los empleados activos.
     */
    public function index()
    {
        $companyId = auth()->user()->company_id ?? 1;

        $employees = DB::table('users')
            ->where('company_id', $companyId)
            ->whereNull('deleted_at')
            ->orderBy('employee_id')
            ->orderBy('name')
            ->select('id', 'name', 'employee_id', 'bank_name', 'bank_account')
            ->get();

        $existingBanks = DB::table('users')
            ->where('company_id', $companyId)
            ->whereNull('deleted_at')
            ->whereNotNull('bank_name')
            ->where('bank_name', '!=', '')
            ->distinct()
            ->orderBy('bank_name')
            ->pluck('bank_name');

        $configuredCount = $employees->filter(fn($e) => !empty($e->bank_account))->count();

        $data = [
            'title' => 'Cuentas Bancarias de Empleados',
        ];

        return view('backend.payroll.employee_bank.index', compact(
            'employees',
            'existingBanks',
            'configuredCount',
            'data'
        ));
    }

    /**
     * Update individual (AJAX) — actualiza la cuenta de un empleado puntual.
     */
    public function update(Request $request, $id)
    {
        $validated = $request->validate([
            'bank_name'    => 'nullable|string|max:255',
            'bank_account' => 'nullable|string|max:255',
        ]);

        $companyId = auth()->user()->company_id ?? 1;

        $user = User::where('id', $id)
            ->where('company_id', $companyId)
            ->whereNull('deleted_at')
            ->first();

        if (!$user) {
            return response()->json([
                'status'  => false,
                'message' => 'Empleado no encontrado.',
            ], 404);
        }

        $user->bank_name    = $validated['bank_name'] ?? null;
        $user->bank_account = $validated['bank_account'] ?? null;
        $user->save();

        return response()->json([
            'status'   => true,
            'message'  => 'Cuenta actualizada correctamente.',
            'employee' => [
                'id'           => $user->id,
                'name'         => $user->name,
                'bank_name'    => $user->bank_name,
                'bank_account' => $user->bank_account,
            ],
        ]);
    }

    /**
     * Update masivo (AJAX) — recibe un array de empleados con sus cuentas
     * y actualiza en una sola transacción. Útil después de pegar datos
     * desde Excel.
     */
    public function bulkUpdate(Request $request)
    {
        $request->validate([
            'employees'                => 'required|array',
            'employees.*.id'           => 'required|integer',
            'employees.*.bank_name'    => 'nullable|string|max:255',
            'employees.*.bank_account' => 'nullable|string|max:255',
        ]);

        $companyId = auth()->user()->company_id ?? 1;
        $updated = 0;
        $errors  = [];

        DB::transaction(function () use ($request, $companyId, &$updated, &$errors) {
            foreach ($request->input('employees') as $row) {
                $u = User::where('id', $row['id'])
                    ->where('company_id', $companyId)
                    ->whereNull('deleted_at')
                    ->first();

                if (!$u) {
                    $errors[] = "Empleado id={$row['id']} no encontrado";
                    continue;
                }

                $u->bank_name    = $row['bank_name'] ?? null;
                $u->bank_account = $row['bank_account'] ?? null;
                $u->save();
                $updated++;
            }
        });

        return response()->json([
            'status'  => true,
            'updated' => $updated,
            'errors'  => $errors,
            'message' => "{$updated} empleados actualizados correctamente.",
        ]);
    }
}
