import requests as requests_http
from . import utils
from codat.models import operations
from typing import Optional

class Sync:
    _client: requests_http.Session
    _security_client: requests_http.Session
    _server_url: str
    _language: str
    _sdk_version: str
    _gen_version: str

    def __init__(self, client: requests_http.Session, security_client: requests_http.Session, server_url: str, language: str, sdk_version: str, gen_version: str) -> None:
        self._client = client
        self._security_client = security_client
        self._server_url = server_url
        self._language = language
        self._sdk_version = sdk_version
        self._gen_version = gen_version
        
    def post_sync_latest(self, request: operations.PostSyncLatestRequest) -> operations.PostSyncLatestResponse:
        r"""Sync commerce data
        Run a Commerce sync from the last successful sync up to the date provided (optional), otherwise UtcNow is used.
        If there was no previously successful sync, the start date in the config is used.
        """
        
        base_url = self._server_url
        
        url = utils.generate_url(operations.PostSyncLatestRequest, base_url, '/companies/{companyId}/sync/commerce/latest', request)
        
        headers = {}
        req_content_type, data, form = utils.serialize_request_body(request, "request_body", 'json')
        if req_content_type not in ('multipart/form-data', 'multipart/mixed'):
            headers['content-type'] = req_content_type
        
        client = self._security_client
        
        http_res = client.request('POST', url, data=data, files=form, headers=headers)
        content_type = http_res.headers.get('Content-Type')

        res = operations.PostSyncLatestResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res)
        
        if http_res.status_code == 200:
            if utils.match_content_type(content_type, 'application/json'):
                out = utils.unmarshal_json(http_res.text, Optional[operations.PostSyncLatest200ApplicationJSON])
                res.post_sync_latest_200_application_json_object = out

        return res

    