from quixote import get_publisher, get_response, get_request, redirect, get_session
from qommon import get_cfg, get_logger
from qommon.storage import StorableObject

from wcs.users import User

class DrupalUser(StorableObject):
    # Simple mapping between a drupal user and a wcs user
    _names = 'drupalusers'
    wcs_user_id = None

    def get_wcs_user(self):
        if not self.wcs_user_id:
            raise KeyError()
        return User.get(self.wcs_user_id)

    def create_wcs_user(self):
        # XXX: look for an existing user with such an email?
        user = User()
        self.update_attributes(user)
        self.wcs_user_id = user.id
        self.store()
        return user

    def update_attributes(self, user):
        users_cfg = get_cfg('users', {})
        drupal_user_name = get_request().get_header('X-WCS-Drupal-User-Name')
        drupal_user_mail = get_request().get_header('X-WCS-Drupal-User-Mail')

        formdata = {}
        field_email = users_cfg.get('field_email')
        if field_email:
            formdata[field_email] = drupal_user_mail
        else:
            user.email = drupal_user_mail

        field_name_values = users_cfg.get('field_name')
        if type(field_name_values) is str: # it was a string in previous versions
            field_name_values = [field_name_values]
        if field_name_values:
            formdata[field_name_values[0]] = drupal_user_name
        else:
            user.name = drupal_user_name

        if formdata:
            user.form_data = formdata
            user.set_attributes_from_formdata(formdata)

        user.store()


def try_auth():
    if not get_publisher().has_site_option('drupal'):
        return

    misc_cfg = get_cfg('misc', {})
    drupal_ip = misc_cfg.get('aq-drupal-ip')
    if not (drupal_ip and get_request().environ.get('REMOTE_ADDR') == drupal_ip):
        return

    drupal_user_id = get_request().get_header('X-WCS-Drupal-User-Uid')
    if not drupal_user_id or str(drupal_user_id) == '0':
        return

    try:
        drupal_user = DrupalUser.get(drupal_user_id)
    except KeyError:
        drupal_user = DrupalUser(id=drupal_user_id)
        drupal_user.store()

    try:
        wcs_user = drupal_user.get_wcs_user()
    except KeyError:
        wcs_user = drupal_user.create_wcs_user()
    else:
        pass # TODO: update wcs user with drupal headers

    session = get_session()
    session.set_user(wcs_user.id)

