# coding: utf-8

"""
    projects-api

    These APIs allows you to create workflow statuses, which are then assigned to workflows. These workflows, containing multiple statuses, are subsequently linked to projects. Additionally, candidates are associated with projects, defining the path they are meant to follow within the established workflows.  # noqa: E501

    OpenAPI spec version: 1.0.0
    
    Generated by: phenom
"""

from __future__ import absolute_import

import re  # noqa: F401

# python 2 and python 3 compatibility library
import six

from phenom.commons.api_client import ApiClient


class CandidatesApi(object):
    base_path = "/projects-api"  # your base path

    def __init__(self, token, gateway_url, apikey, api_client=None):
        if api_client is None:
            api_client = ApiClient(gateway_url + self.base_path, apikey, token)
        self.api_client = api_client

    def add_candidate_to_project(self, body, x_ph_userid, project_id, **kwargs):  # noqa: E501
        """Add Candidates to Project  # noqa: E501

        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        >>> thread = api.add_candidate_to_project(body, x_ph_userid, project_id, async_req=True)
        >>> result = thread.get()

        :param async_req bool
        :param AssignCandidatesToProject body: Create Project (required)
        :param str x_ph_userid: (required)
        :param str project_id: (required)
        :return: AssignCandidateToProjectResponse
                 If the method is called asynchronously,
                 returns the request thread.
        """
        kwargs['_return_http_data_only'] = True
        if kwargs.get('async_req'):
            return self.add_candidate_to_project_with_http_info(body, x_ph_userid, project_id, **kwargs)  # noqa: E501
        else:
            (data) = self.add_candidate_to_project_with_http_info(body, x_ph_userid, project_id, **kwargs)  # noqa: E501
            return data

    def add_candidate_to_project_with_http_info(self, body, x_ph_userid, project_id, **kwargs):  # noqa: E501
        """Add Candidates to Project  # noqa: E501

        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        >>> thread = api.add_candidate_to_project_with_http_info(body, x_ph_userid, project_id, async_req=True)
        >>> result = thread.get()

        :param async_req bool
        :param AssignCandidatesToProject body: Create Project (required)
        :param str x_ph_userid: (required)
        :param str project_id: (required)
        :return: AssignCandidateToProjectResponse
                 If the method is called asynchronously,
                 returns the request thread.
        """

        all_params = ['body', 'x_ph_userid', 'project_id']  # noqa: E501
        all_params.append('async_req')
        all_params.append('_return_http_data_only')
        all_params.append('_preload_content')
        all_params.append('_request_timeout')

        params = locals()
        for key, val in six.iteritems(params['kwargs']):
            if key not in all_params:
                raise TypeError(
                    "Got an unexpected keyword argument '%s'"
                    " to method add_candidate_to_project" % key
                )
            params[key] = val
        del params['kwargs']
        # verify the required parameter 'body' is set
        if ('body' not in params or
                params['body'] is None):
            raise ValueError("Missing the required parameter `body` when calling `add_candidate_to_project`")  # noqa: E501
        # verify the required parameter 'x_ph_userid' is set
        if ('x_ph_userid' not in params or
                params['x_ph_userid'] is None):
            raise ValueError("Missing the required parameter `x_ph_userid` when calling `add_candidate_to_project`")  # noqa: E501
        # verify the required parameter 'project_id' is set
        if ('project_id' not in params or
                params['project_id'] is None):
            raise ValueError("Missing the required parameter `project_id` when calling `add_candidate_to_project`")  # noqa: E501

        collection_formats = {}

        path_params = {}
        if 'project_id' in params:
            path_params['projectId'] = params['project_id']  # noqa: E501

        query_params = []

        header_params = {}
        if 'x_ph_userid' in params:
            header_params['x-ph-userid'] = params['x_ph_userid']  # noqa: E501

        form_params = []
        local_var_files = {}

        body_params = None
        if 'body' in params:
            body_params = params['body']
        # HTTP header `Accept`
        header_params['Accept'] = self.api_client.select_header_accept(
            ['application/json'])  # noqa: E501

        # HTTP header `Content-Type`
        header_params['Content-Type'] = self.api_client.select_header_content_type(  # noqa: E501
            ['application/json'])  # noqa: E501

        # Authentication setting
        auth_settings = []  # noqa: E501

        return self.api_client.call_api(
            '/v1/projects/{projectId}/candidates', 'POST',
            path_params,
            query_params,
            header_params,
            body=body_params,
            post_params=form_params,
            files=local_var_files,
            response_type='AssignCandidateToProjectResponse',  # noqa: E501
            auth_settings=auth_settings,
            async_req=params.get('async_req'),
            _return_http_data_only=params.get('_return_http_data_only'),
            _preload_content=params.get('_preload_content', True),
            _request_timeout=params.get('_request_timeout'),
            collection_formats=collection_formats)

    def get_associated_candidate_ids(self, x_ph_userid, project_id, **kwargs):  # noqa: E501
        """Get CandidateIds for Project.  # noqa: E501

        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        >>> thread = api.get_associated_candidate_ids(x_ph_userid, project_id, async_req=True)
        >>> result = thread.get()

        :param async_req bool
        :param str x_ph_userid: (required)
        :param str project_id: (required)
        :param int _from: The number of candidates to skip before starting to collect the result.
        :param int size: The number of candidates to be included in the result.
        :return: GetProjectAssociationsResponse
                 If the method is called asynchronously,
                 returns the request thread.
        """
        kwargs['_return_http_data_only'] = True
        if kwargs.get('async_req'):
            return self.get_associated_candidate_ids_with_http_info(x_ph_userid, project_id, **kwargs)  # noqa: E501
        else:
            (data) = self.get_associated_candidate_ids_with_http_info(x_ph_userid, project_id, **kwargs)  # noqa: E501
            return data

    def get_associated_candidate_ids_with_http_info(self, x_ph_userid, project_id, **kwargs):  # noqa: E501
        """Get CandidateIds for Project.  # noqa: E501

        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        >>> thread = api.get_associated_candidate_ids_with_http_info(x_ph_userid, project_id, async_req=True)
        >>> result = thread.get()

        :param async_req bool
        :param str x_ph_userid: (required)
        :param str project_id: (required)
        :param int _from: The number of candidates to skip before starting to collect the result.
        :param int size: The number of candidates to be included in the result.
        :return: GetProjectAssociationsResponse
                 If the method is called asynchronously,
                 returns the request thread.
        """

        all_params = ['x_ph_userid', 'project_id', '_from', 'size']  # noqa: E501
        all_params.append('async_req')
        all_params.append('_return_http_data_only')
        all_params.append('_preload_content')
        all_params.append('_request_timeout')

        params = locals()
        for key, val in six.iteritems(params['kwargs']):
            if key not in all_params:
                raise TypeError(
                    "Got an unexpected keyword argument '%s'"
                    " to method get_associated_candidate_ids" % key
                )
            params[key] = val
        del params['kwargs']
        # verify the required parameter 'x_ph_userid' is set
        if ('x_ph_userid' not in params or
                params['x_ph_userid'] is None):
            raise ValueError("Missing the required parameter `x_ph_userid` when calling `get_associated_candidate_ids`")  # noqa: E501
        # verify the required parameter 'project_id' is set
        if ('project_id' not in params or
                params['project_id'] is None):
            raise ValueError("Missing the required parameter `project_id` when calling `get_associated_candidate_ids`")  # noqa: E501

        collection_formats = {}

        path_params = {}
        if 'project_id' in params:
            path_params['projectId'] = params['project_id']  # noqa: E501

        query_params = []
        if '_from' in params:
            query_params.append(('from', params['_from']))  # noqa: E501
        if 'size' in params:
            query_params.append(('size', params['size']))  # noqa: E501

        header_params = {}
        if 'x_ph_userid' in params:
            header_params['x-ph-userid'] = params['x_ph_userid']  # noqa: E501

        form_params = []
        local_var_files = {}

        body_params = None
        # HTTP header `Accept`
        header_params['Accept'] = self.api_client.select_header_accept(
            ['application/json'])  # noqa: E501

        # Authentication setting
        auth_settings = []  # noqa: E501

        return self.api_client.call_api(
            '/v1/projects/{projectId}/candidates', 'GET',
            path_params,
            query_params,
            header_params,
            body=body_params,
            post_params=form_params,
            files=local_var_files,
            response_type='GetProjectAssociationsResponse',  # noqa: E501
            auth_settings=auth_settings,
            async_req=params.get('async_req'),
            _return_http_data_only=params.get('_return_http_data_only'),
            _preload_content=params.get('_preload_content', True),
            _request_timeout=params.get('_request_timeout'),
            collection_formats=collection_formats)

    def get_project_activities(self, candidate_id, x_ph_userid, **kwargs):  # noqa: E501
        """Get project Activities  # noqa: E501

        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        >>> thread = api.get_project_activities(candidate_id, x_ph_userid, async_req=True)
        >>> result = thread.get()

        :param async_req bool
        :param str candidate_id: candidateId (required)
        :param str x_ph_userid: (required)
        :param int _from: The number of activities to skip before starting to collect the result
        :param int size: size of the result
        :return: GetProjectActivitiesResponse
                 If the method is called asynchronously,
                 returns the request thread.
        """
        kwargs['_return_http_data_only'] = True
        if kwargs.get('async_req'):
            return self.get_project_activities_with_http_info(candidate_id, x_ph_userid, **kwargs)  # noqa: E501
        else:
            (data) = self.get_project_activities_with_http_info(candidate_id, x_ph_userid, **kwargs)  # noqa: E501
            return data

    def get_project_activities_with_http_info(self, candidate_id, x_ph_userid, **kwargs):  # noqa: E501
        """Get project Activities  # noqa: E501

        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        >>> thread = api.get_project_activities_with_http_info(candidate_id, x_ph_userid, async_req=True)
        >>> result = thread.get()

        :param async_req bool
        :param str candidate_id: candidateId (required)
        :param str x_ph_userid: (required)
        :param int _from: The number of activities to skip before starting to collect the result
        :param int size: size of the result
        :return: GetProjectActivitiesResponse
                 If the method is called asynchronously,
                 returns the request thread.
        """

        all_params = ['candidate_id', 'x_ph_userid', '_from', 'size']  # noqa: E501
        all_params.append('async_req')
        all_params.append('_return_http_data_only')
        all_params.append('_preload_content')
        all_params.append('_request_timeout')

        params = locals()
        for key, val in six.iteritems(params['kwargs']):
            if key not in all_params:
                raise TypeError(
                    "Got an unexpected keyword argument '%s'"
                    " to method get_project_activities" % key
                )
            params[key] = val
        del params['kwargs']
        # verify the required parameter 'candidate_id' is set
        if ('candidate_id' not in params or
                params['candidate_id'] is None):
            raise ValueError("Missing the required parameter `candidate_id` when calling `get_project_activities`")  # noqa: E501
        # verify the required parameter 'x_ph_userid' is set
        if ('x_ph_userid' not in params or
                params['x_ph_userid'] is None):
            raise ValueError("Missing the required parameter `x_ph_userid` when calling `get_project_activities`")  # noqa: E501

        collection_formats = {}

        path_params = {}
        if 'candidate_id' in params:
            path_params['candidateId'] = params['candidate_id']  # noqa: E501

        query_params = []
        if '_from' in params:
            query_params.append(('from', params['_from']))  # noqa: E501
        if 'size' in params:
            query_params.append(('size', params['size']))  # noqa: E501

        header_params = {}
        if 'x_ph_userid' in params:
            header_params['x-ph-userid'] = params['x_ph_userid']  # noqa: E501

        form_params = []
        local_var_files = {}

        body_params = None
        # HTTP header `Accept`
        header_params['Accept'] = self.api_client.select_header_accept(
            ['application/json'])  # noqa: E501

        # Authentication setting
        auth_settings = []  # noqa: E501

        return self.api_client.call_api(
            '/v1/candidates/{candidateId}/project-activities', 'GET',
            path_params,
            query_params,
            header_params,
            body=body_params,
            post_params=form_params,
            files=local_var_files,
            response_type='GetProjectActivitiesResponse',  # noqa: E501
            auth_settings=auth_settings,
            async_req=params.get('async_req'),
            _return_http_data_only=params.get('_return_http_data_only'),
            _preload_content=params.get('_preload_content', True),
            _request_timeout=params.get('_request_timeout'),
            collection_formats=collection_formats)

    def remove_candidate_from_project(self, project_id, candidate_id, x_ph_userid, **kwargs):  # noqa: E501
        """Delete candidate from project  # noqa: E501

        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        >>> thread = api.remove_candidate_from_project(project_id, candidate_id, x_ph_userid, async_req=True)
        >>> result = thread.get()

        :param async_req bool
        :param str project_id: The projectId from which the candidate needs to be removed (required)
        :param str candidate_id: The userId of the candidate whom needs to be removed (required)
        :param str x_ph_userid: (required)
        :return: DeleteCandidateFromProject
                 If the method is called asynchronously,
                 returns the request thread.
        """
        kwargs['_return_http_data_only'] = True
        if kwargs.get('async_req'):
            return self.remove_candidate_from_project_with_http_info(project_id, candidate_id, x_ph_userid, **kwargs)  # noqa: E501
        else:
            (data) = self.remove_candidate_from_project_with_http_info(project_id, candidate_id, x_ph_userid, **kwargs)  # noqa: E501
            return data

    def remove_candidate_from_project_with_http_info(self, project_id, candidate_id, x_ph_userid, **kwargs):  # noqa: E501
        """Delete candidate from project  # noqa: E501

        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        >>> thread = api.remove_candidate_from_project_with_http_info(project_id, candidate_id, x_ph_userid, async_req=True)
        >>> result = thread.get()

        :param async_req bool
        :param str project_id: The projectId from which the candidate needs to be removed (required)
        :param str candidate_id: The userId of the candidate whom needs to be removed (required)
        :param str x_ph_userid: (required)
        :return: DeleteCandidateFromProject
                 If the method is called asynchronously,
                 returns the request thread.
        """

        all_params = ['project_id', 'candidate_id', 'x_ph_userid']  # noqa: E501
        all_params.append('async_req')
        all_params.append('_return_http_data_only')
        all_params.append('_preload_content')
        all_params.append('_request_timeout')

        params = locals()
        for key, val in six.iteritems(params['kwargs']):
            if key not in all_params:
                raise TypeError(
                    "Got an unexpected keyword argument '%s'"
                    " to method remove_candidate_from_project" % key
                )
            params[key] = val
        del params['kwargs']
        # verify the required parameter 'project_id' is set
        if ('project_id' not in params or
                params['project_id'] is None):
            raise ValueError("Missing the required parameter `project_id` when calling `remove_candidate_from_project`")  # noqa: E501
        # verify the required parameter 'candidate_id' is set
        if ('candidate_id' not in params or
                params['candidate_id'] is None):
            raise ValueError("Missing the required parameter `candidate_id` when calling `remove_candidate_from_project`")  # noqa: E501
        # verify the required parameter 'x_ph_userid' is set
        if ('x_ph_userid' not in params or
                params['x_ph_userid'] is None):
            raise ValueError("Missing the required parameter `x_ph_userid` when calling `remove_candidate_from_project`")  # noqa: E501

        collection_formats = {}

        path_params = {}
        if 'project_id' in params:
            path_params['projectId'] = params['project_id']  # noqa: E501
        if 'candidate_id' in params:
            path_params['candidateId'] = params['candidate_id']  # noqa: E501

        query_params = []

        header_params = {}
        if 'x_ph_userid' in params:
            header_params['x-ph-userid'] = params['x_ph_userid']  # noqa: E501

        form_params = []
        local_var_files = {}

        body_params = None
        # HTTP header `Accept`
        header_params['Accept'] = self.api_client.select_header_accept(
            ['application/json'])  # noqa: E501

        # Authentication setting
        auth_settings = []  # noqa: E501

        return self.api_client.call_api(
            '/v1/projects/{projectId}/candidates/{candidateId}', 'DELETE',
            path_params,
            query_params,
            header_params,
            body=body_params,
            post_params=form_params,
            files=local_var_files,
            response_type='DeleteCandidateFromProject',  # noqa: E501
            auth_settings=auth_settings,
            async_req=params.get('async_req'),
            _return_http_data_only=params.get('_return_http_data_only'),
            _preload_content=params.get('_preload_content', True),
            _request_timeout=params.get('_request_timeout'),
            collection_formats=collection_formats)
