lib/wolf_core/application/integrations/contract_api_operations.rb



module WolfCore
  module Integrations
    module ContractApiOperations
      include WolfCore::HttpOperations

      CONTRACT_ID_REGEX = /.*-(\d+)-(\d+)/

      def fetch_contract!(wolf_token:, tenant:, wolf_platform_url:, contract_id:, error_message:, error_data: nil, query: nil)
        response = fetch_contract(
          wolf_token: wolf_token,
          tenant: tenant,
          wolf_platform_url: wolf_platform_url,
          contract_id: contract_id,
          query: query
        )
        order_id, jobseeker_id = extract_ids_from_contract_id(contract_id)
        error_data ||= {}
        validate_http_response(
          response: response,
          message: error_message,
          error_data: error_data.merge(contract_id: contract_id, order_id: order_id, jobseeker_id: jobseeker_id, query: query)
        )
        response.body.dig("data", "table", "contract")
      end

      def fetch_contract(wolf_token:, tenant:, wolf_platform_url:, contract_id:, query: nil)
        order_id, jobseeker_id = extract_ids_from_contract_id(contract_id)
        query ||= {}
        parsed_http_get(
          headers: { "Authorization" => "Bearer #{wolf_token}" },
          url: "#{wolf_platform_url}/api/v2/contracts/#{order_id}/#{jobseeker_id}",
          query: query.merge(tenant: tenant)
        )
      end

      def update_contract!(wolf_token:, tenant:, wolf_platform_url:, contract_id:, contract:, error_message:, error_data: nil)
        response = update_contract(
          wolf_token: wolf_token,
          tenant: tenant,
          wolf_platform_url: wolf_platform_url,
          contract_id: contract_id,
          contract: contract
        )
        order_id, jobseeker_id = extract_ids_from_contract_id(contract_id)
        error_data ||= {}
        validate_http_response(
          response: response,
          message: error_message,
          error_data: error_data.merge(contract_id: contract_id, order_id: order_id, jobseeker_id: jobseeker_id, contract: contract)
        )
        response
      end

      def update_contract(wolf_token:, tenant:, wolf_platform_url:, contract_id:, contract:)
        order_id, jobseeker_id = extract_ids_from_contract_id(contract_id)
        parsed_http_put(
          headers: { "Authorization" => "Bearer #{wolf_token}" },
          url: "#{wolf_platform_url}/api/v2/contracts/#{order_id}/#{jobseeker_id}",
          query: { tenant: tenant },
          body: contract
        )
      end

      private

      def extract_ids_from_contract_id(contract_id)
        match = contract_id.match(CONTRACT_ID_REGEX)
        raise_service_error(message: "Invalid contract_id format", data: { contract_id: contract_id }) unless match
        order_id = match[1]
        jobseeker_id = match[2]
        [order_id, jobseeker_id]
      end
    end
  end
end