/home2/mshostin/farms.ms-hostingladz.com/app/Http/Controllers/AnimalController.php
<?php
namespace App\Http\Controllers;

use App\Http\Requests\AnimalRequest;
use App\Models\Animal;
use App\Services\AnimalService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AnimalController extends Controller
{
    protected $service;

    public function __construct(AnimalService $service)
    {
        $this->service = $service;

        // $permissions = [
        //     'index'   => 'view-animals',
        //     'store'   => 'create-animals',
        //     'update'  => 'edit-animals',
        //     'destroy' => 'delete-animals',
        // ];

        // foreach ($permissions as $method => $permission) {
        //     $this->middleware("permission:{$permission}")->only($method);
        // }
    }

    public function index()
    {
        $animals = $this->service->list();
        return view('animals.index', compact('animals'));
    }

    public function show(Animal $animal)
    {
        $currentUser = Auth::user();

        if ($currentUser->isFarmAdmin() && $animal->farm_id != $currentUser->farm_id) {
            abort(403, 'Unauthorized');
        }

        $animal->load('farm', 'milkProductions');

        $today     = now()->toDateString();
        $yesterday = now()->subDay()->toDateString();

        $todayMilk     = $animal->milkProductions()->whereDate('recorded_at', $today)->sum('litres');
        $yesterdayMilk = $animal->milkProductions()->whereDate('recorded_at', $yesterday)->sum('litres');

        $milkDiffPercent = $yesterdayMilk > 0
            ? (($todayMilk - $yesterdayMilk) / $yesterdayMilk) * 100
            : 0;

        $monthly = $animal->milkProductions()
            ->where('recorded_at', '>=', now()->subDays(30))
            ->orderBy('recorded_at')
            ->get()
            ->groupBy(function ($row) {
                return \Carbon\Carbon::parse($row->recorded_at)->format('d M');
            })
            ->map(function ($day) {
                return $day->sum('litres');
            });

        $monthlyLabels = $monthly->keys();
        $monthlyValues = $monthly->values();

        return view('animals.show', compact(
            'animal',
            'todayMilk',
            'yesterdayMilk',
            'milkDiffPercent',
            'monthlyLabels',
            'monthlyValues'
        ));
    }

    // public function show(Animal $animal)
    // {
    //     $currentUser = Auth::user();

    //     // Farm admins can only view animals in their farm
    //     if ($currentUser->isFarmAdmin() && $animal->farm_id != $currentUser->farm_id) {
    //         abort(403, 'Unauthorized');
    //     }

    //     // Load related farm if needed
    //     $animal->load('farm');

    //     return view('animals.show', compact('animal'));
    // }

    public function create()
    {
        $currentUser = Auth::user();

        // Only super admin or farm admin can create
        if (! $currentUser->isSuperAdmin() && ! $currentUser->isFarmAdmin()) {
            abort(403);
        }

        return view('animals.create', [
            'farms' => $currentUser->isSuperAdmin()
                ? \App\Models\Farm::all()
                : \App\Models\Farm::where('id', $currentUser->farm_id)->get(),
        ]);
    }

    public function store(AnimalRequest $request)
    {
        $data        = $request->validated();
        $currentUser = Auth::user();

        // Farm admins can only create in their farm
        if ($currentUser->isFarmAdmin()) {
            $data['farm_id'] = $currentUser->farm_id;
        }

        $this->service->create($data);
        return redirect()->route('animals.index')->with('success', 'Animal created successfully.');
    }

    public function edit(Animal $animal)
    {
        $currentUser = Auth::user();

        // Farm admin can only edit their own animals
        if ($currentUser->isFarmAdmin() && $animal->farm_id != $currentUser->farm_id) {
            abort(403);
        }

        return view('animals.edit', compact('animal'));
    }

    public function update(AnimalRequest $request, Animal $animal)
    {
        $currentUser = Auth::user();

        // Farm admin can only update their own animals
        if ($currentUser->isFarmAdmin() && $animal->farm_id != $currentUser->farm_id) {
            abort(403);
        }

        $this->service->update($animal, $request->validated());
        return redirect()->route('animals.index')->with('success', 'Animal updated successfully.');
    }

    public function destroy(Animal $animal)
    {
        $currentUser = Auth::user();

        // Farm admin can only delete their own animals
        if ($currentUser->isFarmAdmin() && $animal->farm_id != $currentUser->farm_id) {
            abort(403);
        }

        $this->service->delete($animal);
        return redirect()->route('animals.index')->with('success', 'Animal deleted successfully.');
    }

    public function loadSubpanel(Request $request, Animal $animal, $panel)
    {
        $page    = $request->get('page', 1);
        $perPage = 10;
        $search  = $request->get('search', '');

        $mapping = [
            'milk-production' => 'milkProductions',
            'reproductions'   => 'reproductions',
            'calves'          => 'calves',
            'health-checks'   => 'healthChecks',
            'vaccinations'    => 'vaccinations',
            'treatments'      => 'treatments',
            'diseases'        => 'diseases',
        ];

        if (! isset($mapping[$panel])) {
            return response()->json(['html' => '<p>Invalid panel.</p>']);
        }

        $relation = $mapping[$panel];

        // $data = $animal->$relation()->orderBy('id', 'desc')->paginate($perPage);
        $search = $request->get('search', '');

        $query = $animal->$relation()->orderBy('id', 'desc');

        if (! empty($search)) {
            $query->where(function ($q) use ($search) {
                // search in all non-id columns
                foreach ($q->getModel()->getFillable() as $field) {
                    if (! str_ends_with($field, '_id')) {
                        $q->orWhere($field, 'like', "%{$search}%");
                    }
                }
            });
        }

        $data = $query->paginate($perPage);

        return response()->json([
            'html' => view('animals.partials.subpanel-table', [
                'data'   => $data,
                'panel'  => $panel,
                'search' => $search,
            ])->render(),
        ]);
    }
}