<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\AttendancePolicy;
use App\Services\Attendance\AttendancePolicyResolver;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;

class AttendancePolicyController extends Controller
{
    public function __construct(
        protected AttendancePolicyResolver $policyResolver
    ) {}

    public function edit()
    {
        $policy = $this->policyResolver->forCompany((int) Auth::user()?->company_id);

        return view('attendance-policy.edit', compact('policy'));
    }

    public function update(Request $request)
    {
        $companyId = (int) Auth::user()?->company_id;
        $validated = $request->validate([
            'mode' => ['required', Rule::in(AttendancePolicy::MODES)],
            'remote_approval_required' => ['nullable', 'boolean'],
            'default_radius_meters' => ['required', 'integer', 'min:10', 'max:10000'],
            'gps_accuracy_requirement' => ['nullable', 'integer', 'min:1', 'max:1000'],
            'require_location_for_office' => ['nullable', 'boolean'],
            'allow_web_checkin' => ['nullable', 'boolean'],
            'allow_mobile_checkin' => ['nullable', 'boolean'],
            'biometric_attendance_mode' => ['required', Rule::in([
                AttendancePolicy::BIOMETRIC_MODE_FIRST_IN_LAST_OUT,
                AttendancePolicy::BIOMETRIC_MODE_PAIRWISE,
            ])],
            'biometric_min_punch_gap_minutes' => ['required', 'integer', 'min:1', 'max:60'],
        ]);

        $flags = AttendancePolicy::syncDerivedFlags($validated['mode']);
        $policy = $this->policyResolver->forCompany($companyId);
        $policy->fill([
            'mode' => $validated['mode'],
            'geo_fence_enabled' => $flags['geo_fence_enabled'],
            'remote_attendance_enabled' => $flags['remote_attendance_enabled'],
            'remote_approval_required' => $request->boolean('remote_approval_required'),
            'default_radius_meters' => (int) $validated['default_radius_meters'],
            'gps_accuracy_requirement' => $validated['gps_accuracy_requirement'] !== null && $validated['gps_accuracy_requirement'] !== ''
                ? (int) $validated['gps_accuracy_requirement']
                : null,
            'require_location_for_office' => $request->boolean('require_location_for_office'),
            'allow_web_checkin' => $request->boolean('allow_web_checkin'),
            'allow_mobile_checkin' => $request->boolean('allow_mobile_checkin'),
            'biometric_attendance_mode' => $validated['biometric_attendance_mode'],
            'biometric_min_punch_gap_minutes' => (int) $validated['biometric_min_punch_gap_minutes'],
        ]);
        $policy->company_id = $companyId;
        $policy->save();

        return redirect()->route('attendance-policy.edit')->with('success', 'Attendance policy saved.');
    }
}
