"""Workflow for applicants.
"""
import grok
from datetime import datetime
from hurry.workflow.workflow import Transition, WorkflowState, NullCondition
from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent
from waeup.sirp.applicants.interfaces import IApplicantBaseData
from waeup.sirp.interfaces import IObjectHistory, IWAeUPWorkflowInfo
from waeup.sirp.workflow import WAeUPWorkflow, WAeUPWorkflowInfo
from waeup.sirp.utils.helpers import get_current_principal

INITIALIZED = 'initialized'
STARTED = 'started'
SUBMITTED = 'submitted'
ADMITTED = 'admitted'
NOT_ADMITTED = 'not admitted'
CREATED = 'created'

APPLICATION_TRANSITIONS = (
    Transition(
        transition_id = 'init',
        title = 'Initialize application',
        source = None,
        condition = NullCondition,
        msg = 'Application initialized',
        destination = INITIALIZED),

    Transition(
        transition_id = 'start',
        title = 'Start application',
        msg = 'Application started',
        source = INITIALIZED,
        destination = STARTED),

    Transition(
        transition_id = 'submit',
        title = 'Submit application',
        msg = 'Application submitted',
        source = STARTED,
        destination = SUBMITTED),

    Transition(
        transition_id = 'admit',
        title = 'Admit applicant',
        msg = 'Applicant admitted',
        source = SUBMITTED,
        destination = ADMITTED),

    Transition(
        transition_id = 'refuse1',
        title = 'Refuse application',
        msg = 'Application refused',
        source = SUBMITTED,
        destination = NOT_ADMITTED),

    Transition(
        transition_id = 'refuse2',
        title = 'Refuse application',
        msg = 'Application refused',
        source = ADMITTED,
        destination = NOT_ADMITTED),

    Transition(
        transition_id = 'create',
        title = 'Create student record',
        msg = 'Student record created',
        source = ADMITTED,
        destination = CREATED),

    Transition(
        transition_id = 'reset1',
        title = 'Reset application',
        msg = 'Application reset',
        source = SUBMITTED,
        destination = STARTED),

    Transition(
        transition_id = 'reset2',
        title = 'Reset application',
        msg = 'Application reset',
        source = ADMITTED,
        destination = STARTED),

    Transition(
        transition_id = 'reset3',
        title = 'Reset application',
        msg = 'Application reset',
        source = NOT_ADMITTED,
        destination = STARTED),

    Transition(
        transition_id = 'reset4',
        title = 'Reset application',
        msg = 'Application reset',
        source = CREATED,
        destination = STARTED),
    )

application_workflow = WAeUPWorkflow(APPLICATION_TRANSITIONS)

class ApplicationWorkflowState(WorkflowState, grok.Adapter):
    """An adapter to adapt Applicant objects to workflow states.
    """
    grok.context(IApplicantBaseData)
    grok.provides(IWorkflowState)

    state_key = 'wf.application.state'
    state_id = 'wf.application.id'

class ApplicationWorkflowInfo(WAeUPWorkflowInfo, grok.Adapter):
    """Adapter to adapt Applicant objects to workflow info objects.
    """
    grok.context(IApplicantBaseData)
    grok.provides(IWAeUPWorkflowInfo)

    def __init__(self, context):
        self.context = context
        self.wf = application_workflow

@grok.subscribe(IApplicantBaseData, IWorkflowTransitionEvent)
def handle_applicant_transition_event(obj, event):
    """Append message to applicant history when transition happened.
    """
    msg = '%s' % event.transition.user_data['msg']
    history = IObjectHistory(obj)
    history.addMessage(msg)
    # In some tests we don't have a an applicants root or a user
    try:
        user = get_current_principal()
        applicants_root = grok.getSite()['applicants']
        applicants_root.logger.info('%s - %s - %s' % (user.id,obj.access_code,msg))
    except (TypeError, AttributeError):
        pass
    return
