# By: Riasat Ullah
# This file deals with Sentry related database queries.

from utils import integration_type_names, key_manager
import datetime
import psycopg2
import uuid


def get_sentry_integration_details(conn, timestamp, installation_id):
    '''
    Get the ID of the service a slack channel is integrated to.
    :param conn: db connection
    :param timestamp: timestamp when this request is being made
    :param installation_id: the installation ID specific to this organization's Sentry-TaskCall integration
    :return: (tuple) -> (organization ID, service ID, integration ID, concealed integration key)
    '''
    assert isinstance(timestamp, datetime.datetime)
    assert isinstance(installation_id, str)

    query = '''
            select organization_id, serviceid, integration_id, integration_key
            from service_integrations
            where start_timestamp <= %(timestamp)s
                and end_timestamp > %(timestamp)s
                and (additional_info->>'sentry_installation_id')::uuid = %(install_id)s
                and integration_type_id in (
                    select integration_type_id from integration_types
                    where start_date <= %(timestamp)s
                        and end_date > %(timestamp)s
                        and integration_type = %(sentry_type)s
                );
            '''
    query_params = {'timestamp': timestamp, 'install_id': uuid.UUID(installation_id),
                    'sentry_type': integration_type_names.sentry}
    try:
        result = conn.fetch(query, query_params)
        for org_id, serv_id, integ_id, integ_key in result:
            return org_id, serv_id, integ_id, key_manager.conceal_reference_key(integ_key)

        return None, None, None, None
    except psycopg2.DatabaseError:
        raise
