package com.android.trisolarisserver.controller import com.android.trisolarisserver.component.PropertyAccess import com.android.trisolarisserver.controller.dto.PayuPaymentLinkSettingsResponse import com.android.trisolarisserver.controller.dto.PayuPaymentLinkSettingsUpsertRequest import com.android.trisolarisserver.models.payment.PayuPaymentLinkSettings import com.android.trisolarisserver.models.property.Role import com.android.trisolarisserver.repo.PayuPaymentLinkSettingsRepo import com.android.trisolarisserver.repo.PropertyRepo import com.android.trisolarisserver.security.MyPrincipal import org.springframework.http.HttpStatus import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController import org.springframework.web.server.ResponseStatusException import java.time.OffsetDateTime import java.util.UUID @RestController @RequestMapping("/properties/{propertyId}/payu-payment-link-settings") class PayuPaymentLinkSettingsController( private val propertyAccess: PropertyAccess, private val propertyRepo: PropertyRepo, private val settingsRepo: PayuPaymentLinkSettingsRepo ) { @GetMapping fun getSettings( @PathVariable propertyId: UUID, @AuthenticationPrincipal principal: MyPrincipal? ): PayuPaymentLinkSettingsResponse { requireRole(propertyAccess, propertyId, principal, Role.ADMIN, Role.MANAGER) val settings = settingsRepo.findByPropertyId(propertyId) if (settings == null) { return PayuPaymentLinkSettingsResponse( propertyId = propertyId, configured = false, merchantId = null, isTest = false, hasClientId = false, hasClientSecret = false, hasAccessToken = false ) } return settings.toResponse() } @PutMapping fun upsertSettings( @PathVariable propertyId: UUID, @AuthenticationPrincipal principal: MyPrincipal?, @RequestBody request: PayuPaymentLinkSettingsUpsertRequest ): PayuPaymentLinkSettingsResponse { requireRole(propertyAccess, propertyId, principal, Role.ADMIN, Role.MANAGER) val property = propertyRepo.findById(propertyId).orElseThrow { ResponseStatusException(HttpStatus.NOT_FOUND, "Property not found") } val merchantId = request.merchantId.trim().ifBlank { throw ResponseStatusException(HttpStatus.BAD_REQUEST, "merchantId required") } val isTest = request.isTest ?: false val existing = settingsRepo.findByPropertyId(propertyId) val updated = if (existing == null) { PayuPaymentLinkSettings( property = property, merchantId = merchantId, clientId = request.clientId?.trim()?.ifBlank { null }, clientSecret = request.clientSecret?.trim()?.ifBlank { null }, accessToken = request.accessToken?.trim()?.ifBlank { null }, isTest = isTest, updatedAt = OffsetDateTime.now() ) } else { existing.merchantId = merchantId val oldClientId = existing.clientId val oldClientSecret = existing.clientSecret val oldIsTest = existing.isTest if (request.clientId != null) existing.clientId = request.clientId.trim().ifBlank { null } if (request.clientSecret != null) existing.clientSecret = request.clientSecret.trim().ifBlank { null } if (request.accessToken != null) existing.accessToken = request.accessToken.trim().ifBlank { null } existing.isTest = isTest val credsChanged = (request.clientId != null && existing.clientId != oldClientId) || (request.clientSecret != null && existing.clientSecret != oldClientSecret) || oldIsTest != isTest if (credsChanged) { existing.accessToken = null existing.tokenExpiresAt = null } existing.updatedAt = OffsetDateTime.now() existing } return settingsRepo.save(updated).toResponse() } } private fun PayuPaymentLinkSettings.toResponse(): PayuPaymentLinkSettingsResponse { val propertyId = property.id ?: throw ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Property id missing") return PayuPaymentLinkSettingsResponse( propertyId = propertyId, configured = true, merchantId = merchantId, isTest = isTest, hasClientId = !clientId.isNullOrBlank(), hasClientSecret = !clientSecret.isNullOrBlank(), hasAccessToken = !accessToken.isNullOrBlank() ) }