'required|string|max:128', 'location' => 'required|string|max:128', 'map_URL' => 'required|url', 'lat' => 'required|string', 'long' => 'required|string', 'BranchId' => 'required|string', 'contact_number' => 'required|array|min:1', 'contact_number.*' => 'regex:/^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$/|min:7', 'code' => 'required|string', 'isSched' => 'required|in:0,1', 'date' => 'required_if:isSched,1|date', ]; protected $messages = [ 'name.required' => 'Station name is required!', 'location.required' => 'Station location is required!', 'map_URL.required' => 'Url is required!', 'lat.required' => 'Lat is required!', 'long.required' => 'Long is required!', 'BranchId.required' => 'Branch is required!', 'contact_number.required' => 'Contact number is required!', 'contact_number.*.regex' => 'Please enter a valid contact number', 'contact_number.*.min' => 'Minimum character is 7', 'code.required' => 'Station code is required!', 'isSched.required' => 'Please select a schedule update value.', 'date.required_if' => 'Scheduled date is required when scheduling is enabled.', ]; public function mount($id) { $this->id = $id; $this->fetchStation(); $this->fetchBranches(); $this->fetchFuels(); } public function fetchStation() { try { $response = Http::get("https://api.example.com/stations/{$this->id}"); if ($response->successful()) { $station = $response->json(); $this->name = $station['name']; $this->location = $station['location']; $this->map_URL = $station['map_Url']; $this->lat = $station['lat']; $this->long = $station['long']; $this->BranchId = $station['BranchId']; $this->contact_number = explode(',', $station['contact_number']); $this->code = $station['code']; $this->fuels = $this->sortFuels($station['StationFuels'] ?? []); $this->isSched = $station['Schedule'] ? 1 : 2; $this->date = $station['Schedule']; } else { $this->alert('error', 'Failed to fetch station data.'); } } catch (\Exception $e) { $this->alert('error', 'An error occurred: ' . $e->getMessage()); } } public function fetchBranches() { try { $response = Http::get('https://api.example.com/branches/noLimit'); if ($response->successful()) { $this->branches = $response->json()['data'] ?? []; } } catch (\Exception $e) { $this->alert('error', 'An error occurred while fetching branches.'); } } public function fetchFuels() { try { $response = Http::get('https://api.example.com/fuels'); if ($response->successful()) { $this->fuelsData = $response->json()['data'] ?? []; $this->newFuel = array_filter($this->fuelsData, fn($fuel) => !in_array($fuel['id'], array_column($this->fuels, 'FuelId'))); } } catch (\Exception $e) { $this->alert('error', 'An error occurred while fetching fuels.'); } } public function sortFuels($fuels) { $sorted = array_map(function ($fuel) { $nameParts = explode(' ', $fuel['Fuel']['name'] ?? $fuel['name']); $val = (int) end($nameParts) ?: 0; return ['val' => $val, 'data' => $fuel]; }, $fuels); usort($sorted, fn($a, $b) => $a['val'] <=> $b['val']); return array_map(fn($item) => $item['data'], $sorted); } public function updateFuels($price, $id, $isFuel = true) { $this->fuels = array_map(function ($fuel) use ($price, $id, $isFuel) { $fuelId = $isFuel ? ($fuel['FuelId'] ?? $fuel['id']) : $fuel['id']; if ($fuelId === $id) { $fuel['price'] = $price; } return $fuel; }, $this->fuels); } public function addToStationFuel($selectedFuels) { $newFuels = array_filter($this->fuelsData, fn($fuel) => in_array($fuel['id'], $selectedFuels)); $this->fuels = array_merge($this->fuels, array_map(fn($fuel) => [ 'FuelId' => $fuel['id'], 'name' => $fuel['name'], 'price' => '0.00', ], $newFuels)); $this->newFuel = array_filter($this->newFuel, fn($fuel) => !in_array($fuel['id'], $selectedFuels)); $this->fuelModal = false; } public function removeFuel($index, $name) { $this->fuelIndex = $index; $this->fuelName = $name; $this->removeModal = true; } public function confirmRemoveFuel() { $this->fuels = array_filter($this->fuels, fn($_, $i) => $i !== $this->fuelIndex, ARRAY_FILTER_USE_BOTH); $this->removeModal = false; $this->fetchFuels(); } public function save() { $this->validate(); if (empty($this->fuels) && $this->isSched == 1) { $this->alert('error', 'Cannot schedule a station without fuel.'); return; } if ($this->fuels && array_filter($this->fuels, fn($fuel) => in_array($fuel['price'], [0, '0.00', '00.00', null]))) { $this->alert('error', 'Invalid price for fuel.'); return; } $this->loading = true; try { $response = Http::put("https://api.example.com/stations/{$this->id}", [ 'name' => $this->name, 'location' => $this->location, 'map_Url' => $this->map_URL, 'lat' => $this->lat, 'long' => $this->long, 'contact_number' => implode(',', $this->contact_number), 'BranchId' => $this->BranchId, 'code' => $this->code, 'Schedule' => $this->isSched == 1 ? $this->date : null, 'NewStationFuel' => array_map(fn($fuel) => [ 'FuelId' => $fuel['FuelId'], 'price' => $fuel['price'], ], $this->fuels), 'modified_by' => auth()->user()->name ?? 'user', // Adjust based on your auth ]); if ($response->successful()) { $this->alert('success', 'Station updated successfully!'); return redirect('/stations'); } else { $this->alert('error', 'Failed to update station.'); } } catch (\Exception $e) { $this->alert('error', 'An error occurred: ' . $e->getMessage()); } finally { $this->loading = false; } } public function cancel() { if (confirm('Are you sure you want to discard changes?')) { return redirect('/stations'); } } public function render() { return view('livewire.station-locator.edit-station', [ 'branches' => $this->branches, 'fuelsData' => $this->fuelsData, 'newFuel' => $this->newFuel, ])->layout('layouts.app', ['title' => $this->title]); } }