"""Interface to the ows-abacus-state microservice.""" from http import HTTPStatus from typing import Any, Literal from owsrequest import flask_request from payee.config import ows_client from payee.schemas.ows_abacus_state import AbacusStateSchema from payee.utils.exception import AbacusStateException SERVICE_NAME = 'ows-abacus-state' def get_payee_states( payee_entity_id: int, payee_type: Literal['payee', 'account_payee'] = 'account_payee', ) -> dict[str, dict[str, Any]]: """Get all ABACUS states by payee ID.""" ows_headers = flask_request.get_ows_headers() response = ows_client.get( SERVICE_NAME, # TODO: add test to check that this endpoint is properly called depending on payee_type f'/abacus-state/{payee_type}/{payee_entity_id}/', headers=ows_headers, ) if response.status_code == HTTPStatus.OK: data = AbacusStateSchema(many=True).load(response.json()) return {item['action_name']: item for item in data} raise AbacusStateException(f'got {response.status_code}') def create_payee_states( payee_entity_id: int, payee_type: Literal['payee', 'account_payee'], actions: list[str], ) -> dict[str, dict[str, Any]]: """Create account payee states.""" ows_headers = flask_request.get_ows_headers() response = ows_client.post( SERVICE_NAME, '/abacus-states/', headers=ows_headers, json=[ { 'action_name': action_name, 'parent_table_id': payee_entity_id, 'parent_table_name': payee_type, } for action_name in actions ], ) if response.status_code == HTTPStatus.CREATED: data = AbacusStateSchema(many=True).load(response.json()) return {item['action_name']: item for item in data} raise AbacusStateException(f'got {response.status_code}') def create_payee_states_by_parent_table( payee_entity_id: int, payee_type: Literal['payee', 'account_payee'] = 'account_payee', ) -> dict[str, dict[str, Any]]: """Create payee states by parent table.""" ows_headers = flask_request.get_ows_headers() response = ows_client.post( SERVICE_NAME, f'/abacus-states/{payee_type}/{payee_entity_id}', headers=ows_headers, ) if response.status_code == HTTPStatus.CREATED: data = AbacusStateSchema(many=True).load(response.json()) return {item['action_name']: item for item in data} raise AbacusStateException(f'got {response.status_code}') def update_state( abacus_state_id: int, action_status: str, message: str | None ) -> dict[str, Any]: """Create account payee states.""" ows_headers = flask_request.get_ows_headers() response = ows_client.put( SERVICE_NAME, f'/abacus-state/{abacus_state_id}/', headers=ows_headers, json={ 'action_status': action_status, 'message': message, }, ) if response.status_code == HTTPStatus.OK: data = AbacusStateSchema().load(response.json()) return data raise AbacusStateException(f'got {response.status_code}')