"""Store model.""" from sqlalchemy import bindparam, text from sqlalchemy.exc import NoResultFound from vectororder.connectors.mysql import art_db_connector, dd_db_connector from vectororder.constants import fields, sql from vectororder.models.schemas import DistributionFeatureId, Store def is_hd_only(store_id: int) -> bool: """Check if store only accepts hd products. Args: store_id (int) Returns: bool """ with art_db_connector.db_session() as session: result = session.execute( text(sql.AR_GET_STORE), { "customer_master_master_id": store_id, }, ) store = result.mappings().one() return bool(store["hd_only"] == "Y") def has_hd_encoding_profile(store_id: int) -> bool: """Check encoding profile of store is hd. Args: store_id (int) Returns: bool """ with dd_db_connector.db_session() as session: result = session.execute( text(sql.DD_GET_ENCODING_PROFILE).bindparams( bindparam("encoding_formats", expanding=True) ), { "dms_id": store_id, "encoding_formats": [fields.HD_WAV_PROFILES, fields.HD_FLAC_PROFILES], }, ) return bool(result.first()) def get_distribution_features(store_id: int) -> set[DistributionFeatureId]: """Get distribution features.""" with art_db_connector.db_session() as session: result = session.execute( text( """ SELECT cmdt.distribution_features_ids AS distribution_feature_ids, cmdt.distribution_type_id FROM customer_master_master_distribution_type cmdt WHERE cmdt.customer_master_master_id = :store_id AND cmdt.distribution_type_id = 1; """ ), { "store_id": store_id, }, ) try: distribution_features: set[DistributionFeatureId] = set() for row in result.mappings().all(): distribution_features.update( [ DistributionFeatureId(int(distribution_feature_id)) for distribution_feature_id in row.distribution_feature_ids.split( "," ) ] ) return distribution_features except NoResultFound: return set() def get_store(store_id: int) -> Store: """Get store.""" return Store( store_id=store_id, is_physical="physical" in get_store_classifications(store_id), distribution_feature_ids=get_distribution_features(store_id), ) def get_store_classifications(store_id: int) -> list[str]: """Get store classifications.""" with art_db_connector.db_session() as session: result = session.execute( text(sql.AR_GET_STORE_CLASSIFICATION), { "store_id": store_id, }, ) try: rows = result.mappings().all() return [row["classification"].lower() for row in rows] except NoResultFound: return []