# The absolute import feature is required so that we get the root celery
# module rather than `amo.celery`.
from __future__ import absolute_import

from inspect import isclass

from celery.datastructures import AttributeDict
fr
om tower import ugettext_lazy as _


__all__ = ('LOG', 'LOG_BY_ID', 'LOG_KEEP',)


class _LOG(object):
    action_class = None


class CREATE_ADDON(_LOG):
    id
 = 1
    action_class = 'add'
    format = _(u'{addon} was created.')
    keep = True


class EDIT_PROPERTIES(_LOG):
    """ Expects: addon """
    id = 2
    action_class = 'edit'
    format = _(u'{addon} properties edited.')


class EDIT_DESCRIPTIONS(_LOG):
    id = 3
    action_class = 'edit'
    format = _(u'{addon} description edited.')


class EDIT_CATEGORIES(_LOG):
    id = 4
    action_class = 'edit'
    format = _(u'Categories edited for {addon}.')


class ADD_USER_WITH_ROLE(_LOG):
    id = 5
    action_class = 'add'
    format = _(u'{0.name} ({1}) added to {addon}.')
    keep = True


class REMOVE_USER_WITH_ROLE(_LOG):
    id = 6
    action_class = 'delete'
    # L10n: {0} is the user being removed, {1} is their role.
    format = _(u'{0.name} ({1}) removed from {addon}.')
    keep = True


class EDIT_CONTRIBUTIONS(_LOG):
    id = 7
    action_class = 'edit'
    format = _(u'Contributions for {addon}.')


class USER_DISABLE(_LOG):
    id = 8
    format = _(u'{addon} disabled.')
    keep = True


class USER_ENABLE(_LOG):
    id = 9
    format = _(u'{addon} enabled.')
    keep = True


# TODO(davedash): Log these types when pages are present
class SET_PUBLIC_STATS(_LOG):
    id = 10
    format = _(u'Stats set public for {addon}.')
    keep = True


# TODO(davedash): Log these types when pages are present
class UNSET_PUBLIC_STATS(_LOG):
    id = 11
    format = _(u'{addon} stats set to private.')
    keep = True


class CHANGE_STATUS(_LOG):
    id = 12
    # L10n: {0} is the status
    format = _(u'{addon} status changed to {0}.')
    keep = True


class ADD_PREVIEW(_LOG):
    id = 13
    action_class = 'add'
    format = _(u'Preview added to {addon}.')


class EDIT_PREVIEW(_LOG):
    id = 14
    action_class = 'edit'
    format = _(u'Preview edited for {addon}.')


class DELETE_PREVIEW(_LOG):
    id = 15
    action_class = 'delete'
    format = _(u'Preview deleted from {addon}.')


class ADD_VERSION(_LOG):
    id = 16
    action_class = 'add'
    format = _(u'{version} added to {addon}.')
    keep = True


class EDIT_VERSION(_LOG):
    id = 17
    action_class = 'edit'
    format = _(u'{version} edited for {addon}.')


class DELETE_VERSION(_LOG):
    id = 18
    action_class = 'delete'
    # Note, {0} is a string not a version since the version is deleted.
    # L10n: {0} is the version number
    format = _(u'Version {0} deleted from {addon}.')
    keep = True


class ADD_FILE_TO_VERSION(_LOG):
    id = 19
    action_class = 'add'
    format = _(u'File {0.name} added to {version} of {addon}.')


class DELETE_FILE_FROM_VERSION(_LOG):
    """
    Expecting: addon, filename, version
    Because the file is being deleted, filename and version
    should be strings and not the object.
    """
    id = 20
    action_class = 'delete'
    format = _(u'File {0} deleted from {version} of {addon}.')


class APPROVE_VERSION(_LOG):
    id = 21
    action_class = 'approve'
    format = _(u'{addon} {version} approved.')
    short = _(u'Approved')
    keep = True
    review_email_user = True
    review_queue = True


class PRELIMINARY_VERSION(_LOG):
    id = 42
    action_class = 'approve'
    format = _(u'{addon} {version} given preliminary review.')
    short = _(u'Preliminarily approved')
    keep = True
    review_email_user = True
    review_queue = True


class REJECT_VERSION(_LOG):
    # takes add-on, version, reviewtype
    id = 43
    action_class = 'reject'
    format = _(u'{addon} {version} rejected.')
    short = _(u'Rejected')
    keep = True
    review_email_user = True
    review_queue = True


class RETAIN_VERSION(_LOG):
    # takes add-on, version, reviewtype
    id = 22
    format = _(u'{addon} {version} retained.')
    short = _(u'Retained')
    keep = True
    review_email_user = True
    review_queue = True


class ESCALATE_VERSION(_LOG):
    # takes add-on, version, reviewtype
    id = 23
    format = _(u'{addon} {version} escalated.')
    short = _(u'Escalated')
    keep = True
    review_email_user = True
    review_queue = True


class REQUEST_VERSION(_LOG):
    # takes add-on, version, reviewtype
    id = 24
    format = _(u'{addon} {version} review requested.')
    short = _(u'Review requested')
    keep = True
    review_email_user = True
    review_queue = True


class REQUEST_INFORMATION(_LOG):
    id = 44
    format = _(u'{addon} {version} more information requested.')
    short = _(u'More information requested')
    keep = True
    review_email_user = True
    review_queue = True


class REQUEST_SUPER_REVIEW(_LOG):
    id = 45
    format = _(u'{addon} {version} super review requested.')
    short = _(u'Super review requested')
    keep = True
    review_queue = True


class COMMENT_VERSION(_LOG):
    id = 49
    format = _(u'Comment on {addon} {version}.')
    short = _(u'Comment')
    keep = True
    review_queue = True
    hide_developer = True


class ADD_TAG(_LOG):
    id = 25
    action_class = 'tag'
    format = _(u'{tag} added to {addon}.')


class REMOVE_TAG(_LOG):
    id = 26
    action_class = 'tag'
    format = _(u'{tag} removed from {addon}.')


class ADD_TO_COLLECTION(_LOG):
    id = 27
    action_class = 'collection'
    format = _(u'{addon} added to {collection}.')


class REMOVE_FROM_COLLECTION(_LOG):
    id = 28
    action_class = 'collection'
    format = _(u'{addon} removed from {collection}.')


class ADD_REVIEW(_LOG):
    id = 29
    action_class = 'review'
    format = _(u'{review} for {addon} written.')


# TODO(davedash): Add these when we do the admin site
class ADD_RECOMMENDED_CATEGORY(_LOG):
    id = 31
    action_class = 'edit'
    # L10n: {0} is a category name.
    format = _(u'{addon} featured in {0}.')


class REMOVE_RECOMMENDED_CATEGORY(_LOG):
    id = 32
    action_class = 'edit'
    # L10n: {0} is a category name.
    format = _(u'{addon} no longer featured in {0}.')


class ADD_RECOMMENDED(_LOG):
    id = 33
    format = _(u'{addon} is now featured.')
    keep = True


class REMOVE_RECOMMENDED(_LOG):
    id = 34
    format = _(u'{addon} is no longer featured.')
    keep = True


class ADD_APPVERSION(_LOG):
    id = 35
    action_class = 'add'
    # L10n: {0} is the application, {1} is the version of the app
    format = _(u'{0} {1} added.')


class CHANGE_USER_WITH_ROLE(_LOG):
    """ Expects: author.user, role, addon """
    id = 36
    # L10n: {0} is a user, {1} is their role
    format = _(u'{0.name} role changed to {1} for {addon}.')
    keep = True


class CHANGE_LICENSE(_LOG):
    """ Expects: license, addon """
    id = 37
    action_class = 'edit'
    format = _(u'{addon} is now licensed under {0.name}.')


class CHANGE_POLICY(_LOG):
    id = 38
    action_class = 'edit'
    format = _(u'{addon} policy changed.')


class CHANGE_ICON(_LOG):
    id = 39
    action_class = 'edit'
    format = _(u'{addon} icon changed.')


class APPROVE_REVIEW(_LOG):
    id = 40
    action_class = 'approve'
    format = _(u'{review} for {addon} approved.')
    editor_format = _(u'{user} approved {review} for {addon}.')
    keep = True
    editor_event = True


class DELETE_REVIEW(_LOG):
    """Requires review.id and add-on objects."""
    id = 41
    action_class = 'review'
    format = _(u'Review {review} for {addon} deleted.')
    editor_format = _(u'{user} deleted {review} for {addon}.')
    keep = True
    editor_event = True


class MAX_APPVERSION_UPDATED(_LOG):
    id = 46
    format = _(u'Application max version for {version} updated.')


class BULK_VALIDATION_EMAILED(_LOG):
    id = 47
    format = _(u'Authors emailed about compatibility of {version}.')


class BULK_VALIDATION_USER_EMAILED(_LOG):
    id = 130
    format = _(u'Email sent to Author about add-on compatibility.')


class CHANGE_PASSWORD(_LOG):
    id = 48
    format = _(u'Password changed.')


class PAYPAL_FAILED(_LOG):
    id