<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\Shift;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ShiftController extends Controller
{
    public function index()
    {
        $companyId = Auth::user()?->company_id;
        $query = Shift::withCount('users')->orderBy('name');
        if ($companyId) {
            $query->where('company_id', $companyId);
        }
        $shifts = $query->paginate(15);

        return view('shifts.index', compact('shifts'));
    }

    public function create()
    {
        return view('shifts.create');
    }

    public function store(Request $request)
    {
        $companyId = Auth::user()?->company_id;
        $validated = $request->validate([
            'name' => 'required|string|max:191',
            'clock_in_time' => 'required|date_format:H:i',
            'clock_out_time' => 'required|date_format:H:i',
        ]);
        $validated['company_id'] = $companyId;
        Shift::create($validated);

        return redirect()->route('shifts.index')->with('success', 'Shift created successfully.');
    }

    public function edit(Shift $shift)
    {
        $this->authorizeShift($shift);

        return view('shifts.edit', compact('shift'));
    }

    public function update(Request $request, Shift $shift)
    {
        $this->authorizeShift($shift);
        $validated = $request->validate([
            'name' => 'required|string|max:191',
            'clock_in_time' => 'required|date_format:H:i',
            'clock_out_time' => 'required|date_format:H:i',
        ]);
        $shift->update($validated);

        return redirect()->route('shifts.index')->with('success', 'Shift updated successfully.');
    }

    public function destroy(Shift $shift)
    {
        $this->authorizeShift($shift);

        if ($shift->users()->exists()) {
            return redirect()->route('shifts.index')
                ->with('error', 'Cannot delete a shift that is assigned to employees.');
        }

        $shift->delete();

        return redirect()->route('shifts.index')->with('success', 'Shift deleted successfully.');
    }

    protected function authorizeShift(Shift $shift): void
    {
        $companyId = Auth::user()?->company_id;
        if ($companyId && $shift->company_id !== $companyId) {
            abort(403);
        }
    }
}
