<?php

namespace App\Http\Controllers\Care;

use App\Http\Controllers\Controller;
use App\Http\Controllers\Care\Concerns\RequiresPlanFeature;
use App\Http\Controllers\Care\Concerns\ScopesToAccount;
use App\Models\Branch;
use App\Services\Care\AuditLogger;
use App\Services\Care\PlanService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class BranchController extends Controller
{
    use RequiresPlanFeature;
    use ScopesToAccount;

    private const FEATURE = 'branches';

    private const UPGRADE_MESSAGE = 'Multi-branch management requires Care Pro.';

    public function index(Request $request): View
    {
        $this->authorizeAbility($request, 'admin.branches.view');

        if ($upgrade = $this->proFeatureUpgradeView(
            $request,
            self::FEATURE,
            'Branches',
            'Manage clinic locations and sites with Care Pro. Free plans include one branch created during setup.',
        )) {
            return $upgrade;
        }

        $organization = $this->organization($request);

        $branches = Branch::owned($this->ownerRef($request))
            ->where('organization_id', $organization->id)
            ->withCount('departments')
            ->orderBy('name')
            ->get();

        $heroStats = [
            'total' => $branches->count(),
            'active' => $branches->where('is_active', true)->count(),
            'departments' => $branches->sum('departments_count'),
        ];

        return view('care.admin.branches.index', compact('branches', 'organization', 'heroStats'));
    }

    public function create(Request $request): View
    {
        $this->authorizeAbility($request, 'admin.branches.manage');

        if ($upgrade = $this->proFeatureUpgradeView(
            $request,
            self::FEATURE,
            'Branches',
            'Add and manage multiple clinic locations with Care Pro.',
        )) {
            return $upgrade;
        }

        return view('care.admin.branches.create', ['organization' => $this->organization($request)]);
    }

    public function store(Request $request): RedirectResponse
    {
        $this->authorizeAbility($request, 'admin.branches.manage');

        if ($deny = $this->denyWithoutFeature($request, self::FEATURE, self::UPGRADE_MESSAGE)) {
            return $deny;
        }

        $organization = $this->organization($request);
        $owner = $this->ownerRef($request);

        $currentCount = Branch::owned($owner)
            ->where('organization_id', $organization->id)
            ->count();

        $plans = app(PlanService::class);
        if (! $plans->canAddBranch($organization, $currentCount)) {
            return redirect()
                ->route('care.pro.index')
                ->with('upsell', $plans->branchLimitMessage($organization));
        }

        $validated = $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'code' => ['nullable', 'string', 'max:50'],
            'address' => ['nullable', 'string', 'max:500'],
            'phone' => ['nullable', 'string', 'max:50'],
        ]);

        $branch = Branch::create([
            'owner_ref' => $owner,
            'organization_id' => $organization->id,
            ...$validated,
            'is_active' => true,
        ]);

        AuditLogger::record($owner, 'branch.created', $organization->id, $owner, Branch::class, $branch->id);

        return redirect()->route('care.branches.index')->with('success', 'Branch created.');
    }

    public function edit(Request $request, Branch $branch): View
    {
        $this->authorizeAbility($request, 'admin.branches.manage');
        $this->authorizeOwner($request, $branch);

        if ($upgrade = $this->proFeatureUpgradeView(
            $request,
            self::FEATURE,
            'Branches',
            'Edit clinic locations with Care Pro. Free plans include one branch created during setup.',
        )) {
            return $upgrade;
        }

        return view('care.admin.branches.edit', compact('branch'));
    }

    public function update(Request $request, Branch $branch): RedirectResponse
    {
        $this->authorizeAbility($request, 'admin.branches.manage');
        $this->authorizeOwner($request, $branch);

        if ($deny = $this->denyWithoutFeature($request, self::FEATURE, self::UPGRADE_MESSAGE)) {
            return $deny;
        }

        $validated = $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'code' => ['nullable', 'string', 'max:50'],
            'address' => ['nullable', 'string', 'max:500'],
            'phone' => ['nullable', 'string', 'max:50'],
            'is_active' => ['boolean'],
        ]);

        $branch->update([
            ...$validated,
            'is_active' => $request->boolean('is_active', true),
        ]);

        AuditLogger::record(
            $this->ownerRef($request),
            'branch.updated',
            $branch->organization_id,
            $this->ownerRef($request),
            Branch::class,
            $branch->id,
        );

        return redirect()->route('care.branches.index')->with('success', 'Branch updated.');
    }
}
