<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\Payee;
use App\Services\AuditService;
use App\Support\EmployeeValidation;
use App\Support\FormTextRules;
use Illuminate\Http\Request;

class PayeeController extends Controller
{
    public function __construct(
        protected AuditService $audit
    ) {
        $this->middleware('finance.treasury');
    }

    public function index()
    {
        $payees = Payee::orderBy('name')->paginate(15);

        return view('payees.index', compact('payees'));
    }

    public function create()
    {
        return view('payees.create');
    }

    public function store(Request $request)
    {
        $request->merge(EmployeeValidation::normalize($request->only(['email', 'phone'])));
        $validated = $request->validate($this->rules(), $this->messages());
        $validated['company_id'] = auth()->user()->company_id;

        $payee = Payee::create($validated);
        $this->audit->log('payee.created', $payee);

        return redirect()->route('payees.index')->with('success', 'Payee created successfully.');
    }

    public function edit(Payee $payee)
    {
        $this->assertTenantRecord($payee);

        return view('payees.edit', compact('payee'));
    }

    public function update(Request $request, Payee $payee)
    {
        $this->assertTenantRecord($payee);

        $request->merge(EmployeeValidation::normalize($request->only(['email', 'phone'])));
        $validated = $request->validate($this->rules(), $this->messages());
        $payee->update($validated);
        $this->audit->log('payee.updated', $payee);

        return redirect()->route('payees.index')->with('success', 'Payee updated successfully.');
    }

    public function destroy(Payee $payee)
    {
        $this->assertTenantRecord($payee);
        $payee->delete();
        $this->audit->log('payee.deleted', null, ['payee_id' => $payee->id]);

        return redirect()->route('payees.index')->with('success', 'Payee deleted.');
    }

    /**
     * @return array<string, mixed>
     */
    protected function rules(): array
    {
        return [
            'name' => FormTextRules::notNumericOnly(true, 191),
            'email' => ['nullable', 'email', 'max:191'],
            'phone' => ['nullable', 'digits:10'],
            'address' => FormTextRules::notNumericOnly(false, 500),
        ];
    }

    /**
     * @return array<string, string>
     */
    protected function messages(): array
    {
        return array_merge(FormTextRules::messages(), [
            'phone.digits' => EmployeeValidation::messages()['phone.digits'],
        ]);
    }

    protected function assertTenantRecord(Payee $payee): void
    {
        $companyId = auth()->user()?->company_id;
        if ($companyId && (int) $payee->company_id !== (int) $companyId) {
            abort(403);
        }
    }
}
