package com.android.trisolarispms import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.lifecycle.viewmodel.compose.viewModel import com.android.trisolarispms.ui.AppRoute import com.android.trisolarispms.ui.auth.AuthScreen import com.android.trisolarispms.ui.auth.AuthViewModel import com.android.trisolarispms.ui.auth.NameScreen import com.android.trisolarispms.ui.auth.UnauthorizedScreen import com.android.trisolarispms.ui.home.HomeScreen import com.android.trisolarispms.ui.property.AddPropertyScreen import com.android.trisolarispms.ui.room.RoomFormScreen import com.android.trisolarispms.ui.room.RoomsScreen import com.android.trisolarispms.ui.card.IssueTemporaryCardScreen import com.android.trisolarispms.ui.roomimage.RoomImagesScreen import com.android.trisolarispms.ui.roomimage.ImageTagsScreen import com.android.trisolarispms.ui.roomimage.AddImageTagScreen import com.android.trisolarispms.ui.roomimage.EditImageTagScreen import com.android.trisolarispms.ui.roomstay.ActiveRoomStaysScreen import com.android.trisolarispms.ui.roomtype.AddAmenityScreen import com.android.trisolarispms.ui.roomtype.AddRoomTypeScreen import com.android.trisolarispms.ui.roomtype.AmenitiesScreen import com.android.trisolarispms.ui.roomtype.EditAmenityScreen import com.android.trisolarispms.ui.roomtype.EditRoomTypeScreen import com.android.trisolarispms.ui.roomtype.RoomTypesScreen import com.android.trisolarispms.ui.theme.TrisolarisPMSTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { TrisolarisPMSTheme { val authViewModel: AuthViewModel = viewModel() val state by authViewModel.state.collectAsState() if (state.unauthorized) { UnauthorizedScreen( message = state.error ?: "Not authorized. Contact admin.", onSignOut = authViewModel::signOut ) } else if (state.apiVerified && state.needsName) { NameScreen(viewModel = authViewModel) } else if (state.apiVerified) { val route = remember { mutableStateOf(AppRoute.Home) } val refreshKey = remember { mutableStateOf(0) } val selectedPropertyId = remember { mutableStateOf(null) } val selectedPropertyName = remember { mutableStateOf(null) } val selectedRoom = remember { mutableStateOf(null) } val selectedRoomType = remember { mutableStateOf(null) } val selectedAmenity = remember { mutableStateOf(null) } val selectedImageTag = remember { mutableStateOf(null) } val roomFormKey = remember { mutableStateOf(0) } val amenitiesReturnRoute = remember { mutableStateOf(AppRoute.Home) } val currentRoute = route.value val canManageProperty: (String) -> Boolean = { propertyId -> state.isSuperAdmin || (state.propertyRoles[propertyId]?.contains("ADMIN") == true) } when (currentRoute) { AppRoute.Home -> HomeScreen( userId = state.userId, userName = state.userName, isSuperAdmin = state.isSuperAdmin, onAddProperty = { route.value = AppRoute.AddProperty }, onAmenities = { amenitiesReturnRoute.value = AppRoute.Home route.value = AppRoute.Amenities }, onImageTags = { route.value = AppRoute.ImageTags }, refreshKey = refreshKey.value, selectedPropertyId = selectedPropertyId.value, onSelectProperty = { id, name -> selectedPropertyId.value = id selectedPropertyName.value = name route.value = AppRoute.ActiveRoomStays(id, name) }, onRefreshProfile = authViewModel::refreshMe ) AppRoute.AddProperty -> AddPropertyScreen( onBack = { route.value = AppRoute.Home }, onCreated = { refreshKey.value++ route.value = AppRoute.Home } ) is AppRoute.ActiveRoomStays -> ActiveRoomStaysScreen( propertyId = currentRoute.propertyId, propertyName = currentRoute.propertyName, onBack = { route.value = AppRoute.Home }, onViewRooms = { route.value = AppRoute.Rooms(currentRoute.propertyId) } ) is AppRoute.Rooms -> RoomsScreen( propertyId = currentRoute.propertyId, onBack = { route.value = AppRoute.ActiveRoomStays( currentRoute.propertyId, selectedPropertyName.value ?: "Property" ) }, onAddRoom = { roomFormKey.value++ route.value = AppRoute.AddRoom(currentRoute.propertyId) }, onViewRoomTypes = { route.value = AppRoute.RoomTypes(currentRoute.propertyId) }, canManageRooms = canManageProperty(currentRoute.propertyId), onEditRoom = { selectedRoom.value = it roomFormKey.value++ route.value = AppRoute.EditRoom(currentRoute.propertyId, it.id ?: "") }, onIssueTemporaryCard = { if (it.id != null) { selectedRoom.value = it route.value = AppRoute.IssueTemporaryCard(currentRoute.propertyId, it.id) } } ) is AppRoute.RoomTypes -> RoomTypesScreen( propertyId = currentRoute.propertyId, onBack = { route.value = AppRoute.Rooms(currentRoute.propertyId) }, onAdd = { route.value = AppRoute.AddRoomType(currentRoute.propertyId) }, canManageRoomTypes = canManageProperty(currentRoute.propertyId), onEdit = { selectedRoomType.value = it route.value = AppRoute.EditRoomType(currentRoute.propertyId, it.id ?: "") } ) is AppRoute.AddRoomType -> AddRoomTypeScreen( propertyId = currentRoute.propertyId, onBack = { route.value = AppRoute.RoomTypes(currentRoute.propertyId) }, onSave = { route.value = AppRoute.RoomTypes(currentRoute.propertyId) } ) is AppRoute.EditRoomType -> EditRoomTypeScreen( propertyId = currentRoute.propertyId, roomType = selectedRoomType.value ?: com.android.trisolarispms.data.api.model.RoomTypeDto(id = currentRoute.roomTypeId, code = "", name = ""), onBack = { route.value = AppRoute.RoomTypes(currentRoute.propertyId) }, onSave = { route.value = AppRoute.RoomTypes(currentRoute.propertyId) } ) AppRoute.Amenities -> AmenitiesScreen( onBack = { route.value = amenitiesReturnRoute.value }, onAdd = { route.value = AppRoute.AddAmenity }, canManageAmenities = state.isSuperAdmin, onEdit = { selectedAmenity.value = it route.value = AppRoute.EditAmenity(it.id ?: "") } ) AppRoute.AddAmenity -> AddAmenityScreen( onBack = { route.value = AppRoute.Amenities }, onSave = { route.value = AppRoute.Amenities } ) is AppRoute.EditAmenity -> EditAmenityScreen( amenity = selectedAmenity.value ?: com.android.trisolarispms.data.api.model.AmenityDto(id = currentRoute.amenityId, name = ""), onBack = { route.value = AppRoute.Amenities }, onSave = { route.value = AppRoute.Amenities } ) AppRoute.ImageTags -> ImageTagsScreen( onBack = { route.value = AppRoute.Home }, onAdd = { route.value = AppRoute.AddImageTag }, onEdit = { selectedImageTag.value = it route.value = AppRoute.EditImageTag(it.id ?: "") } ) AppRoute.AddImageTag -> AddImageTagScreen( onBack = { route.value = AppRoute.ImageTags }, onSave = { route.value = AppRoute.ImageTags } ) is AppRoute.EditImageTag -> EditImageTagScreen( tag = selectedImageTag.value ?: com.android.trisolarispms.data.api.model.RoomImageTagDto(id = currentRoute.tagId, name = ""), onBack = { route.value = AppRoute.ImageTags }, onSave = { route.value = AppRoute.ImageTags } ) is AppRoute.AddRoom -> RoomFormScreen( title = "Add Room", propertyId = currentRoute.propertyId, roomId = null, roomData = null, formKey = roomFormKey.value, onBack = { route.value = AppRoute.Rooms(currentRoute.propertyId) }, onSave = { route.value = AppRoute.Rooms(currentRoute.propertyId) }, onViewImages = { } ) is AppRoute.EditRoom -> RoomFormScreen( title = "Modify Room", propertyId = currentRoute.propertyId, roomId = currentRoute.roomId, roomData = selectedRoom.value, formKey = roomFormKey.value, onBack = { route.value = AppRoute.Rooms(currentRoute.propertyId) }, onSave = { route.value = AppRoute.Rooms(currentRoute.propertyId) }, onViewImages = { roomId -> route.value = AppRoute.RoomImages(currentRoute.propertyId, roomId) } ) is AppRoute.IssueTemporaryCard -> IssueTemporaryCardScreen( propertyId = currentRoute.propertyId, roomId = currentRoute.roomId, roomNumber = selectedRoom.value?.roomNumber?.toString(), onBack = { route.value = AppRoute.Rooms(currentRoute.propertyId) } ) is AppRoute.RoomImages -> RoomImagesScreen( propertyId = currentRoute.propertyId, roomId = currentRoute.roomId, onBack = { route.value = AppRoute.EditRoom(currentRoute.propertyId, currentRoute.roomId) } ) } } else { AuthScreen(viewModel = authViewModel) } } } } }