#
# ============LICENSE_START==========================================
# org.onap.vvp/engagementmgr
# ===================================================================
# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
# ===================================================================
#
# Unless otherwise specified, all software contained herein is licensed
# under the Apache License, Version 2.0 (the “License”);
# you may not use this software except in compliance with the License.
# You may obtain a copy of the License at
#
#             http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
#
# Unless otherwise specified, all documentation contained herein is licensed
# under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
# you may not use this documentation except in compliance with the License.
# You may obtain a copy of the License at
#
#             https://creativecommons.org/licenses/by/4.0/
#
# Unless required by applicable law or agreed to in writing, documentation
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# ============LICENSE_END============================================
#
# ECOMP is a trademark and service mark of AT&T Intellectual Property.
'''
Each entity has a model serializer that save/update the object in its \
create()/update() methods and a regular dictionary (map) serializer that \
return a new/updated instance of the object

'''
from rest_framework import serializers

from engagementmanager.models import NextStep, Notification, Activity, \
    ChecklistTemplate, Checklist, ChecklistAuditLog, ChecklistDecision, \
    ChecklistLineItem, ECOMPRelease, EngagementStatus, CustomUser, \
    ChecklistSection

from .models import IceUserProfile, VFC, Engagement, VF, \
    DeploymentTarget, Role, Vendor, DeploymentTargetSite


class RoleModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Role
        fields = '__all__'


class VendorModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Vendor
        fields = '__all__'


class ThinVendorModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Vendor
        fields = ('uuid', 'name')


class SuperThinCustomUserModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = CustomUser
        fields = ('is_active', 'email', 'activation_token')


class ThinCustomUserModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = CustomUser
        fields = ('email', 'activation_token', 'is_active',
                  'activation_token_create_time')


class IceUserProfileModelSerializer(serializers.ModelSerializer):
    role = RoleModelSerializer(many=False)
    company = VendorModelSerializer(many=False)
    user = ThinCustomUserModelSerializer(many=False)

    class Meta:
        model = IceUserProfile


class SuperThinIceUserProfileModelSerializer(serializers.ModelSerializer):
    role = RoleModelSerializer(many=False)
    company = VendorModelSerializer(many=False)
    user = SuperThinCustomUserModelSerializer(many=False)

    class Meta:
        model = IceUserProfile
        fields = ('full_name', 'email', 'uuid', 'role',
                  'user', 'company', 'phone_number')


class SuperThinIceUserProfileModelSerializerForSignals(
        serializers.ModelSerializer):
    role = RoleModelSerializer(many=False)

    class Meta:
        model = IceUserProfile
        fields = ('full_name', 'email', 'role', 'uuid', 'ssh_public_key')


class ThinIceUserProfileModelSerializer(serializers.ModelSerializer):
    role = RoleModelSerializer(many=False)
    company = VendorModelSerializer(many=False)
    user = SuperThinCustomUserModelSerializer(many=False)

    class Meta:
        model = IceUserProfile
        fields = ('email', 'full_name', 'user', 'is_service_provider_contact',
                  'phone_number', 'role', 'uuid', 'company',
                  'ssh_public_key', 'regular_email_updates',
                  'email_updates_on_every_notification',
                  'email_updates_daily_digest', 'rgwa_access_key')


class EngagementStatusModelSerializer(serializers.ModelSerializer):
    creator = SuperThinIceUserProfileModelSerializer(many=False)

    class Meta:
        model = EngagementStatus
        fields = '__all__'


class EngagementModelSerializer(serializers.ModelSerializer):
    engagement_team = SuperThinIceUserProfileModelSerializer(many=True)
    contact_user = SuperThinIceUserProfileModelSerializer(many=False)
    creator = SuperThinIceUserProfileModelSerializer(many=False)
    peer_reviewer = SuperThinIceUserProfileModelSerializer(many=False)
    reviewer = SuperThinIceUserProfileModelSerializer(many=False)
    starred_engagement = SuperThinIceUserProfileModelSerializer(many=True)

    class Meta:
        model = Engagement
        fields = '__all__'


class ThinEngagementModelSerializer(serializers.ModelSerializer):
    creator = SuperThinIceUserProfileModelSerializer(many=False)
    engagement_team = SuperThinIceUserProfileModelSerializer(many=True)
    peer_reviewer = SuperThinIceUserProfileModelSerializer(many=False)
    reviewer = SuperThinIceUserProfileModelSerializer(many=False)

    class Meta:
        model = Engagement
        fields = ('uuid', 'engagement_manual_id', 'creator',
                  'engagement_team', 'peer_reviewer', 'reviewer')


class DeploymentTargetModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = DeploymentTarget
        fields = ('uuid', 'name', 'version', 'weight', 'ui_visibility')


class ECOMPReleaseModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = ECOMPRelease
        fields = ('uuid', 'name', 'weight', 'ui_visibility')


class ThinVFModelSerializer(serializers.ModelSerializer):
    engagement = ThinEngagementModelSerializer(many=False)

    class Meta:
        model = VF
        fields = (
            'uuid', 'name', 'engagement',
            'is_service_provider_internal', 'ecomp_release')


class ThinDeploymentTargetSiteModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = DeploymentTargetSite
        fields = ('uuid', 'name')


class DeploymentTargetSiteModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = DeploymentTargetSite
        fields = '__all__'


class VFModelSerializer(serializers.ModelSerializer):
    engagement = EngagementModelSerializer(many=False)
    deployment_target = DeploymentTargetModelSerializer(many=False)
    ecomp_release = ECOMPReleaseModelSerializer(many=False)
    deployment_target_sites = ThinDeploymentTargetSiteModelSerializer(
        many=True)
    vendor = VendorModelSerializer(many=False)

    class Meta:
        model = VF
        fields = '__all__'


class VFCModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = VFC
        fields = '__all__'


class ActivityModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Activity
        fields = '__all__'


class ThinActivityModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Activity
        fields = ('uuid', 'description', 'create_time', 'metadata')


class NotificationModelSerializer(serializers.ModelSerializer):
    activity = ActivityModelSerializer(many=False)

    class Meta:
        model = Notification
        fields = '__all__'


class ThinNotificationModelSerializer(serializers.ModelSerializer):
    activity = ThinActivityModelSerializer(many=False)

    class Meta:
        model = Notification
        fields = '__all__'


class ChecklistTemplateModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = ChecklistTemplate
        exclude = ('create_time', 'update_time', 'category', 'version')


class ThinChecklistTemplateModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = ChecklistTemplate
        fields = ('uuid', 'name')


class ChecklistModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Checklist
        fields = '__all__'


class SuperThinChecklistModelSerializer(serializers.ModelSerializer):
    owner = ThinIceUserProfileModelSerializer(many=False)

    class Meta:
        model = Checklist
        fields = ('uuid', 'name', 'state', 'owner')


class ThinChecklistModelSerializer(serializers.ModelSerializer):
    engagement = ThinEngagementModelSerializer(many=False)
    template = ThinChecklistTemplateModelSerializer(many=False)
    owner = ThinIceUserProfileModelSerializer(many=False)

    class Meta:
        model = Checklist
        fields = ('uuid', 'name', 'state', 'owner', 'weight',
                  'associated_files', 'engagement', 'template')


class ThinPostChecklistResponseModelSerializer(serializers.ModelSerializer):
    template = ThinChecklistTemplateModelSerializer(many=False)

    class Meta:
        model = Checklist
        fields = ('uuid', 'name', 'state', 'associated_files', 'template')


class UserNextStepModelSerializer(serializers.ModelSerializer):
    engagement_manual_id = serializers.CharField(
        source='engagement.engagement_manual_id')
    engagement_uuid = serializers.CharField(source='engagement.uuid')
    creator_full_name = serializers.CharField(source='creator.full_name')
    vf_name = serializers.CharField(source='engagement.vf.name')

    class Meta:
        model = NextStep
        fields = ('due_date', 'engagement_manual_id', 'description',
                  'create_time', 'creator_full_name',
                  'vf_name', 'engagement_uuid')


class NextStepModelSerializer(serializers.ModelSerializer):
    engagement = EngagementModelSerializer(many=False)
    creator = SuperThinIceUserProfileModelSerializer(many=False)
    last_updater = SuperThinIceUserProfileModelSerializer(many=False)
    assignees = SuperThinIceUserProfileModelSerializer(many=True)

    class Meta:
        model = NextStep
        fields = '__all__'


class ThinNextStepModelSerializer(serializers.ModelSerializer):
    assignees = SuperThinIceUserProfileModelSerializer(many=True)
    last_updater = SuperThinIceUserProfileModelSerializer(many=False)

    class Meta:
        ordering = ('position')
        model = NextStep
        fields = '__all__'


class TestEngineChecklistModelSerializer(serializers.ModelSerializer):
    template_id = serializers.CharField(source='template.uuid')
    engagement_manual_id = serializers.CharField(
        source='engagement.engagement_manual_id')
    engagement_id = serializers.CharField(source='engagement.uuid')
    creator_id = serializers.CharField(source='engagement.creator.uuid')

    class Meta:
        model = Checklist
        fields = ('uuid', 'state', 'associated_files', 'template_id',
                  'engagement_manual_id', 'engagement_id', 'creator_id')


class ChecklistAuditLogModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = ChecklistAuditLog
        fields = '__all__'


class ThinChecklistAuditLogModelSerializer(serializers.ModelSerializer):
    creator = SuperThinIceUserProfileModelSerializer(many=False)

    class Meta:
        model = ChecklistAuditLog
        fields = ('uuid', 'category', 'description', 'create_time', 'creator')


class ChecklistSectionModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = ChecklistSection
        exclude = ('template', 'parent_section', 'create_time', 'update_time')


class ChecklistLineItemModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = ChecklistLineItem
        exclude = ('section', 'template', 'create_time', 'update_time')


class ThinChecklistSectionModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = ChecklistLineItem
        fields = ('uuid', 'name', 'weight', 'description')


class ThinChecklistLineItemModelSerializer(serializers.ModelSerializer):
    section = ThinChecklistSectionModelSerializer(many=False)

    class Meta:
        model = ChecklistLineItem
        fields = ('uuid', 'name', 'line_type', 'weight',
                  'description', 'validation_instructions', 'section')


class ThinChecklistDecisionModelSerializer(serializers.ModelSerializer):
    lineitem = ThinChecklistLineItemModelSerializer(many=False)

    class Meta:
        model = ChecklistDecision
        fields = ('uuid', 'review_value', 'peer_review_value', 'lineitem')


class EngagementModelSerializerForSignal(serializers.ModelSerializer):
    engagement_team = SuperThinIceUserProfileModelSerializerForSignals(
        many=True)
    contact_user = SuperThinIceUserProfileModelSerializerForSignals(many=False)
    creator = SuperThinIceUserProfileModelSerializerForSignals(many=False)
    peer_reviewer = SuperThinIceUserProfileModelSerializerForSignals(
        many=False)
    reviewer = SuperThinIceUserProfileModelSerializerForSignals(many=False)
    starred_engagement = SuperThinIceUserProfileModelSerializerForSignals(
        many=True)

    class Meta:
        model = Engagement
        fields = '__all__'


class VFModelSerializerForSignal(serializers.ModelSerializer):
    engagement = EngagementModelSerializerForSignal(many=False)
    deployment_target = DeploymentTargetModelSerializer(many=False)
    ecomp_release = ECOMPReleaseModelSerializer(many=False)
    deployment_target_sites = ThinDeploymentTargetSiteModelSerializer(
        many=True)
    vendor = VendorModelSerializer(many=False)

    class Meta:
        model = VF
        fields = '__all__'
