# By: Riasat Ullah
# This file contains all the test data for analytics related pages.

from constants import static_vars, var_names
from system_tests.test_data import test_data_incidents, test_data_live_call_routing, test_data_teams, test_data_users, test_data_services
from system_tests import test_tools
import datetime
import random
import string


today = datetime.datetime.now()


aggregate_alert_report = {
    var_names.period: [(today + datetime.timedelta(days=i)).strftime('%m/%d') for i in range(0, 7)],
    var_names.email_notification: [random.randint(0, 50) for i in range(0, 7)],
    var_names.push_notification: [random.randint(0, 50) for i in range(0, 7)],
    var_names.text_notification: [random.randint(0, 30) for i in range(0, 7)],
    var_names.call_notification: [random.randint(0, 30) for i in range(0, 7)],
    var_names.total_notification_count: [random.randint(0, 160) for i in range(0, 7)],
    var_names.notifications: [
        [(today + datetime.timedelta(days=i)).date(), random.randint(0, 50), random.randint(0, 50),
         random.randint(0, 30), random.randint(0, 30), random.randint(0, 160)] for i in range(0, 7)]
}


day_alert_report = []
day_alert_users = [['Adam Smith', 'adam.smith@apollo.taskcallapp.com', '15056778943'],
                   ['Michael Holding', 'michael.holding@apollo.taskcallapp.com', '19476863321'],
                   ['Lisa Podolski', 'lisa.podolski@apollo.taskcallapp.com', '19884597687'],
                   ['Jennifer Brown', 'jennifer.brown@apollo.taskcallapp.com', '18773602908']]
for i in range(0, 67):
    alert_type = random.choice([static_vars.email, static_vars.app, static_vars.text, static_vars.call])
    user_index = random.randint(0, len(day_alert_users) - 1)
    if alert_type == static_vars.email:
        address = day_alert_users[user_index][1]
    elif alert_type == static_vars.text or alert_type == static_vars.call:
        address = day_alert_users[user_index][2]
    else:
        address = None
    day_alert_report.append([
        today - datetime.timedelta(minutes=i*2, seconds=random.randint(0, 27)),
        alert_type, address, day_alert_users[user_index][0]
    ])


user_summary = [
    {
        var_names.preferred_username: 'adsmi',
        var_names.display_name: 'Adam Smith',
        var_names.timezone: 'US/Eastern',
        var_names.incident_count: 112,
        var_names.acknowledged_incident_count: 108,
        var_names.acknowledgement_time: 5.2,
        var_names.resolved_incident_count: 105,
        var_names.resolution_time: 7.1,
        var_names.responsiveness: round(108/112 * 100, 2),
        var_names.effectiveness: round(105/112 * 100, 2)
    },
    {
        var_names.preferred_username: 'lizha',
        var_names.display_name: 'Lisa Zhang',
        var_names.timezone: 'US/Eastern',
        var_names.incident_count: 83,
        var_names.acknowledged_incident_count: 83,
        var_names.acknowledgement_time: 2.7,
        var_names.resolved_incident_count: 83,
        var_names.resolution_time: 8.6,
        var_names.responsiveness: round(83/83 * 100, 2),
        var_names.effectiveness: round(83/83 * 100, 2)
    },
    {
        var_names.preferred_username: 'malom',
        var_names.display_name: 'Mathew Lombard',
        var_names.timezone: 'Europe/Madrid',
        var_names.incident_count: 105,
        var_names.acknowledged_incident_count: 93,
        var_names.acknowledgement_time: 4.5,
        var_names.resolved_incident_count: 87,
        var_names.resolution_time: 5.7,
        var_names.responsiveness: round(93/105 * 100, 2),
        var_names.effectiveness: round(87/105 * 100, 2)
    },
    {
        var_names.preferred_username: 'sihep',
        var_names.display_name: 'Simon Hepburn',
        var_names.timezone: 'US/Eastern',
        var_names.incident_count: 10,
        var_names.acknowledged_incident_count: 10,
        var_names.acknowledgement_time: 2.1,
        var_names.resolved_incident_count: 10,
        var_names.resolution_time: 5.4,
        var_names.responsiveness: round(10 / 10 * 100, 2),
        var_names.effectiveness: round(10 / 10 * 100, 2)
    },
    {
        var_names.preferred_username: 'admid',
        var_names.display_name: 'Adam Midland',
        var_names.timezone: 'US/Eastern',
        var_names.incident_count: 34,
        var_names.acknowledged_incident_count: 32,
        var_names.acknowledgement_time: 1.1,
        var_names.resolved_incident_count: 31,
        var_names.resolution_time: 9.2,
        var_names.responsiveness: round(32 / 34 * 100, 2),
        var_names.effectiveness: round(31 / 34 * 100, 2)
    },
    {
        var_names.preferred_username: 'jejas',
        var_names.display_name: 'Jenna Jasinski',
        var_names.timezone: 'Europe/Madrid',
        var_names.incident_count: 19,
        var_names.acknowledged_incident_count: 15,
        var_names.acknowledgement_time: 0.8,
        var_names.resolved_incident_count: 15,
        var_names.resolution_time: 12.4,
        var_names.responsiveness: round(15 / 19 * 100, 2),
        var_names.effectiveness: round(15 / 19 * 100, 2)
    },
    {
        var_names.preferred_username: 'beric',
        var_names.display_name: 'Ben Ricardo',
        var_names.timezone: 'US/Eastern',
        var_names.incident_count: 27,
        var_names.acknowledged_incident_count: 27,
        var_names.acknowledgement_time: 0.9,
        var_names.resolved_incident_count: 21,
        var_names.resolution_time: 7.22,
        var_names.responsiveness: round(27 / 27 * 100, 2),
        var_names.effectiveness: round(21 / 27 * 100, 2)
    }
]


user_individual = {
    var_names.preferred_username: 'adsmi',
    var_names.display_name: 'Adam Smith',
    var_names.timezone: 'US/Eastern',
    var_names.incident_count: 27,
    var_names.acknowledged_incident_count: 27,
    var_names.acknowledgement_time: 0.9,
    var_names.resolved_incident_count: 21,
    var_names.resolution_time: 7.22,
    var_names.responsiveness: round(27 / 27 * 100, 2),
    var_names.effectiveness: round(25 / 27 * 100, 2),
    var_names.fatigue_metrics: {
        var_names.regular_incident_count: [8, 1, 1],
        var_names.fatigued_incident_count: [5, 1, 1],
        var_names.interruption_hours: [4.5, 'below_ideal'],
        var_names.rest_hours: [1.5, 'ideal']
    },
    var_names.effectiveness_metrics: {
        var_names.data: [[i, random.randint(71, 80)] for i in range(0, 24)],
        var_names.effectiveness: [round(25 / 27 * 100, 2), 'below_ideal']
    },
    var_names.escalation_policy_workload: [['Operations Escalation Policy', 78], ['Core Policy', 12],
                                           ['Payments Group Policy', 34]]
}


# reports test data
postmortem_reports = [
    {
        var_names.report_number: 'ND12V3GH',
        var_names.organization_instance_id: test_data_incidents.incident_list[0][var_names.organization_instance_id],
        var_names.status: 'DRAFT',
        var_names.report_name: 'Security master generated without updates',
        var_names.report_timestamp: today - datetime.timedelta(days=40),
        var_names.created_by: 'Adam Smith',
        var_names.instance_timestamp: today - datetime.timedelta(days=50)
    },
    {
        var_names.report_number: 'XI0H2RF3',
        var_names.organization_instance_id: test_data_incidents.incident_list[0][var_names.organization_instance_id],
        var_names.status: 'IN_REVIEW',
        var_names.report_name: 'Japan morning session hedge failed',
        var_names.report_timestamp: today - datetime.timedelta(days=50),
        var_names.created_by: 'Julia Zhang',
        var_names.instance_timestamp: today - datetime.timedelta(days=52)
    }
]


postmortem_report_details = {
    postmortem_reports[0][var_names.report_number]: {
        **postmortem_reports[0],
        **{
            var_names.complete_by: today.date(),
            var_names.overview: "The security master was generated without corporate actions being accounted for. " +
                                "This caused numerous errors in our locate files resulting in unfilled locate " +
                                "requests. Luckily we were able to catch the issue and re-generate the correct " +
                                "file before trading started.",
            var_names.description: "Bloomberg CACS file was significantly delayed. Our system waited for the file " +
                                   "for 1 hour before it fell back to the default setting of generating today's " +
                                   "file based on the prior days data. This resulted in an incorrect security " +
                                   "master to be generated for the day.",
            var_names.impact: 'Impact',
            var_names.resolution: 'This is what was done to resolve',
            var_names.positives: 'We worked fast.',
            var_names.negatives: 'We could have coordinated better.',
            var_names.preventions: 'We need to add in a check to ensure updates are received first.',
            var_names.reviewers: [[1, 'Adam Schiff', 'COLLABORATOR'], [3, 'Lucy Baldwin', 'REVIEWER']],
            var_names.review_sessions: [[today.date(), datetime.time(9, 30), 1.5],
                                        [today.date(), datetime.time(16, 0), 2]],
            var_names.comments: [
                [today, 'Thomas Martins', 'This looks good'],
                [today, 'Lucy Baldwin', 'Need corrections in section 2.']
            ]
        }
    }
}


# incident analytics
incident_standard_analytics = {
    var_names.period: ['08/12', '08/13', '08/14', '08/15', '08/16', '08/17', '08/18'],
    var_names.incident_count: [random.randint(0, 50) for i in range(0, 7)],
    var_names.acknowledgement_time: [random.randint(0, 80) / 16 for i in range(0, 7)],
    var_names.resolution_time: [random.randint(50, 80)/8 for i in range(0, 7)],
    var_names.total_incident_count: (243, 12),
    var_names.mean_acknowledgement_time: (2.45, 31),
    var_names.mean_resolution_time: (6.67, -8.68),
    var_names.escalation_count: (34, -15.32),
    var_names.incidents: [
        {var_names.organization_instance_id: 11, var_names.task_title: 'Trade Reconciliation Failed - 2020-09-13',
         var_names.service_name: 'Trading Systems', var_names.urgency_level: 4,
         var_names.instance_timestamp: today.date() + datetime.timedelta(minutes=16), var_names.resolved_on: today.date(),
         var_names.duration: 16, var_names.resolved_by: 'Adam Stauffer', var_names.escalation_count: 1},
        {var_names.organization_instance_id: 15, var_names.task_title: 'Payments are bouncing back',
         var_names.service_name: 'Payments Gateway', var_names.urgency_level: 5,
         var_names.instance_timestamp: today.date() + datetime.timedelta(minutes=29),
         var_names.resolved_on: today.date() + datetime.timedelta(minutes=14),
         var_names.duration: 15, var_names.resolved_by: 'Joe Riley', var_names.escalation_count: 0}
    ]
}


# team analytics data
team_day_month_labels = [(datetime.datetime.now() + datetime.timedelta(days=i)).strftime('%m/%d') for i in range(0, 30)]
team_analytics = {
    var_names.incidents: {
        var_names.daily: {var_names.labels: team_day_month_labels,
                          var_names.data: [random.randint(0, 40) for i in range(0, len(team_day_month_labels))]},
        var_names.aggregate: {var_names.labels: ['Operations Team', 'Core Team', 'IT Team'],
                              var_names.data: [56, 31, 5],
                              var_names.average: 30.67}
    },
    var_names.response_time: {
        var_names.daily: {var_names.labels: team_day_month_labels,
                          var_names.data: [random.randint(0, 100) for i in range(0, len(team_day_month_labels))]},
        var_names.aggregate: {var_names.labels: ['Operations Team', 'Core Team', 'IT Team'],
                              var_names.data: [121, 78, 18],
                              var_names.average: 72.33}
    },
    var_names.interruption_hours: {
        var_names.daily: {var_names.labels: team_day_month_labels,
                          var_names.data: [random.randint(0, 10) for i in range(0, len(team_day_month_labels))]},
        var_names.aggregate: {var_names.labels: ['Core Team', 'IT Team', 'Operations Team', ],
                              var_names.data: [15, 5, 0],
                              var_names.average: 6.67}
    },
    var_names.escalation_count: {
        var_names.daily: {var_names.labels: team_day_month_labels,
                          var_names.data: [random.randint(0, 4) for i in range(0, len(team_day_month_labels))]},
        var_names.aggregate: {var_names.labels: ['IT Team', 'Operations Team', 'Core Team'],
                              var_names.data: [5, 2, 0],
                              var_names.average: 2.33}
    }
}


# service analytics data
service_analytics = {
    var_names.critical_urgency_incidents: {
        var_names.incident_count: 23,
        var_names.response_time: 224,
        var_names.mean_resolution_time: 9,
        var_names.longest_resolution_time: 29,
        var_names.trend: [0, 34, 36, 5, 61, 23]
    },
    var_names.high_urgency_incidents: {
        var_names.incident_count: 40,
        var_names.response_time: 651,
        var_names.mean_resolution_time: 12,
        var_names.longest_resolution_time: 98,
        var_names.trend: [2, 54, 60, 67, 50, 40]
    },
    var_names.longest_incidents: [
        {var_names.organization_instance_id: 11, var_names.task_title: 'Vendor payments are failing. Check Gateway.',
         var_names.service_name: 'Payments Gateway', var_names.duration: 98},
        {var_names.organization_instance_id: 21, var_names.task_title: 'Mawa locates server down',
         var_names.service_name: 'Locates', var_names.duration: 48},
        {var_names.organization_instance_id: 463, var_names.task_title: 'Requests to payment servers are failing',
         var_names.service_name: 'Payments Gateway', var_names.duration: 44},
        {var_names.organization_instance_id: 722, var_names.task_title: 'Positions check failed',
         var_names.service_name: 'Positions Server', var_names.duration: 33},
        {var_names.organization_instance_id: 121, var_names.task_title: 'Security Master unavailable',
         var_names.service_name: 'Security Master', var_names.duration: 22},
    ],
    var_names.loudest_services: [
        {var_names.service_name: 'Payments Gateway', var_names.service_ref_id: test_data_services.services_list[1][var_names.service_ref_id], var_names.count: 77},
        {var_names.service_name: 'Vendor REST API', var_names.service_ref_id: test_data_services.services_list[3][var_names.service_ref_id], var_names.count: 61},
        {var_names.service_name: 'Product Database', var_names.service_ref_id: test_data_services.services_list[0][var_names.service_ref_id], var_names.count: 59},
        {var_names.service_name: 'Client Web Server', var_names.service_ref_id: test_data_services.services_list[2][var_names.service_ref_id], var_names.count: 32},
        {var_names.service_name: 'Vendor REST API', var_names.service_ref_id: test_data_services.services_list[3][var_names.service_ref_id], var_names.count: 11}
    ],
    var_names.business_impact: [
        {var_names.service_name: 'Payments Gateway', var_names.service_ref_id: test_data_services.services_list[1][var_names.service_ref_id], var_names.count: 3,
         var_names.business_services: [
             {var_names.business_service_name: 'Payment Collections', var_names.business_service_ref_id: test_data_services.business_services_basic_list[0][1]},
             {var_names.business_service_name: 'Product Inventory', var_names.business_service_ref_id: test_data_services.business_services_basic_list[2][1]}
         ]},
        {var_names.service_name: 'Vendor REST API', var_names.service_ref_id: test_data_services.services_list[3][var_names.service_ref_id], var_names.count: 1,
         var_names.business_services: [
             {var_names.business_service_name: 'Online Catalog', var_names.business_service_ref_id: test_data_services.business_services_basic_list[1][1]}
         ]}
    ],
    var_names.longest_business_impact: [
        {var_names.service_name: 'Payments Gateway', var_names.service_ref_id: test_data_services.services_list[1][var_names.service_ref_id], 
         var_names.business_service_name: 'Payment Collections', var_names.business_service_ref_id: test_data_services.business_services_basic_list[0][1],
         var_names.duration: 34}
    ]
}


# business impact analytics data
business_impact_analytics = {
    var_names.incidents: {var_names.total: 24, var_names.trend: [41, 32, 35, 25, 18, 24]},
    var_names.downtime: {var_names.total: 89, var_names.trend: [78, 77, 72, 99, 57, 89]},
    var_names.business_impact: {var_names.total: 4, var_names.trend: [0, 2, 1, 3, 3, 4]},
    var_names.business_impact_downtime: {var_names.total: 34, var_names.trend: [0, 45, 34, 21, 20, 34]},
    var_names.business_cost: 94012,
    var_names.labor_cost: 6714,
    var_names.total_cost: 100726,

    var_names.most_impacted_business_services: [
        {
            var_names.business_service_name: 'Payment Collections',
            var_names.business_service_ref_id: test_data_services.business_services_basic_list[0][1],
            var_names.services: [
                {
                    var_names.service_name: 'Payments Gateway',
                    var_names.service_ref_id: test_data_services.services_list[1][var_names.service_ref_id]
                },
                {
                    var_names.service_name: 'Vendor REST API',
                    var_names.service_ref_id: test_data_services.services_list[3][var_names.service_ref_id]
                }
            ],
            var_names.count: 3,
            var_names.duration: 21,
            var_names.total_cost: 85012
        },
        {
            var_names.business_service_name: 'Product Inventory',
            var_names.business_service_ref_id: test_data_services.business_services_basic_list[2][1],
            var_names.services: [
                {
                    var_names.service_name: 'Payments Gateway',
                    var_names.service_ref_id: test_data_services.services_list[1][var_names.service_ref_id]
                }
            ],
            var_names.count: 1,
            var_names.duration: 11,
            var_names.total_cost: 20700
        }
    ],
    var_names.loudest_services: [
        {
            var_names.service_name: 'Payments Gateway',
            var_names.service_ref_id: test_data_services.services_list[1][var_names.service_ref_id],
            var_names.teams: [
                {
                    var_names.team_name: 'Operations Team',
                    var_names.team_ref_id: test_data_teams.teams_basic_list[0][1]
                }
            ],
            var_names.count: 12,
            var_names.duration: 320,
            var_names.labor_cost: 1276,
            var_names.business_cost: 100726
        },
        {
            var_names.service_name: 'Vendor REST API',
            var_names.service_ref_id: test_data_services.services_list[3][var_names.service_ref_id],
            var_names.teams: [
                {
                    var_names.team_name: 'Core Team',
                    var_names.team_ref_id: test_data_teams.teams_basic_list[1][1]
                }
            ],
            var_names.count: 8,
            var_names.duration: 171,
            var_names.labor_cost: 2689,
            var_names.business_cost: 0
        }
    ],
    var_names.costliest_incidents: [
        {
            var_names.organization_instance_id: 11,
            var_names.task_title: 'Vendor payments are failing. Check Gateway.',
            var_names.created_on: today - datetime.timedelta(days=20),
            var_names.duration: 89,
            var_names.urgency_level: static_vars.critical_urgency,
            var_names.service_name: 'Payments Gateway',
            var_names.service_ref_id: test_data_services.services_list[1][var_names.service_ref_id],
            var_names.impacted_business_services: [
                {
                    var_names.business_service_name: 'Payment Collections',
                    var_names.business_service_ref_id: test_data_services.business_services_basic_list[0][1],
                },
                {
                    var_names.business_service_name: 'Product Inventory',
                    var_names.business_service_ref_id: test_data_services.business_services_basic_list[2][1],
                }
            ],
            var_names.total_cost: 78000
        },
        {
            var_names.organization_instance_id: 12,
            var_names.task_title: 'Requests to payment servers are failing with exit code 412',
            var_names.created_on: today - datetime.timedelta(days=20, minutes=781),
            var_names.duration: 18,
            var_names.urgency_level: static_vars.high_urgency,
            var_names.service_name: 'Payments Gateway',
            var_names.service_ref_id: test_data_services.services_list[1][var_names.service_ref_id],
            var_names.impacted_business_services: [
                {
                    var_names.business_service_name: 'Payment Collections',
                    var_names.business_service_ref_id: test_data_services.business_services_basic_list[0][1],
                }
            ],
            var_names.total_cost: 21667
        }
    ]
}


live_call_analytics = {
    var_names.usage: {
        var_names.call_count: 91,
        var_names.answered_call_count: [75, 82],
        var_names.missed_call_count: [16, 18],
        var_names.call_duration: 8.45,
        var_names.total_cost: 63.38
    },
    var_names.call_logs: sorted([
        {
            var_names.call_time: datetime.datetime.now() + datetime.timedelta(
                days=random.randint(0, 30 - i), minutes=random.randint(0, 60), seconds=random.randint(0, 60)),
            var_names.from_number: '+1' + ''.join([random.choice(string.digits) for _ in range(0, 10)]),
            var_names.to_number: random.choice([x[var_names.phone]
                                                for x in test_data_live_call_routing.call_routing_list]),
            var_names.call_routing: random.choice([[x[var_names.routing_name], x[var_names.call_routing_ref_id]]
                                                   for x in test_data_live_call_routing.call_routing_list]),
            var_names.service: random.choice([x for item in test_data_live_call_routing.call_routing_list
                                              for x in item[var_names.associated_services]]),
            var_names.call_status: random.choice([static_vars.message_left_state, static_vars.no_answer_state])
            if i % 4 == 0 else static_vars.answered_state,
            var_names.call_duration: round(random.uniform(1, 3), 2) if i % 4 == 0 else round(random.uniform(1, 30), 2),
            var_names.acknowledgement_time: None if i % 4 == 0 else round(random.uniform(0, 3), 2),
            var_names.answer_duration: None if i % 4 == 0 else round(random.uniform(1, 30), 2),
            var_names.answered_by: None if i % 4 == 0 else random.choice(test_data_users.users_list),
            var_names.forwarding_count: random.randint(0, 10),
            var_names.organization_instance_id: random.randint(100, 10000)
        }
        for i in range(0, 30)
    ], key=lambda k: k[var_names.call_time], reverse=True),
    var_names.effectiveness_metrics: sorted([
        {
            var_names.name: random.choice(test_data_users.users_list)[0],
            var_names.preferred_username: random.choice(test_data_users.users_list)[1],
            var_names.call_count: random.randint(20, 30),
            var_names.answered_call_count: random.randint(20, 25),
            var_names.missed_call_count: random.randint(0, 10),
            var_names.acknowledgement_time: random.uniform(0, 4),
            var_names.answer_duration: random.uniform(0, 30),
            var_names.responsiveness: random.randint(60, 100)
        }
        for j in range(0, 10)
    ], key=lambda k: k[var_names.responsiveness], reverse=True),
    var_names.count: {
        var_names.daily: {var_names.labels: ['10/' + str(d) for d in range(1, 31)],
                          var_names.data: [random.randint(0, 50) for _ in range(0, 30)]},
        var_names.hourly: {var_names.labels: [h for h in range(0, 24)],
                           var_names.data: [random.randint(0, 8) for _ in range(0, 24)]},
    }
}
