# By: Riasat Ullah
# This file contains all the configuration settings of the system.

from utils import constants, integration_type_names as intt
import datetime

# ***************************
# host regions
# ***************************
allowed_host_regions = [constants.aws_europe_paris, constants.aws_us_ohio]

# ***************************
# account configs
# ***************************
allowed_credit_currencies = [constants.usd_curr]
allowed_discount_types = [constants.all_discount_type, constants.live_call_routing_volume_discount_type,
                          constants.user_plan_discount_type]
allowed_fee_units = [constants.user_unit, constants.text_unit, constants.call_unit]
allowed_languages = [constants.lang_en, constants.lang_es]
allowed_payment_handlers = [constants.handler_stripe]
allowed_phone_number_types = [constants.local, constants.mobile, constants.toll_free]
card_verification_hold_amount = 50  # USD
closure_token_lifetime = 3          # minutes
closure_verification_lifetime = 5   # minutes
half_bill_period = 15               # days
mail_max_recipients = 50
mail_max_concurrency = 100
new_user_request_lifetime = 2       # days
next_on_call_look_forward = 23      # days
password_reset_token_lifetime = 15  # minutes
registration_token_lifetime = 20    # minutes
temporary_token_lifetime = 60       # minutes
trial_period = 15                   # days
system_start_time = datetime.datetime(2020, 1, 1)      # the date time all built in data should be valid from


# ***************************
# database connection configs
# ***************************
cache_max_connections = 20
mail_cache_max_connections = 4
mail_pool_max_connections = 4
pool_min_connections = 1
pool_max_connections = 50
secondary_cache_max_connections = 2


# *********************
# component type IDs
# *********************

# any changes made here must be reflected in database functions and other queries as well.
routine_component_type_id = 1
policy_component_type_id = 2
service_component_type_id = 3
business_service_component_type_id = 4
conditional_routing_component_type_id = 5
workflow_component_type_id = 6
team_component_type_id = 7
task_component_type_id = 8
integration_component_type_id = 9
live_call_routing_component_type_id = 10
people_component_type_id = 11
group_component_type_id = 12
external_sso_component_type_id = 13
status_page_component_type_id = 14
check_component_type_id = 15
status_page_template_component_type_id = 16
status_page_subscriber_component_type_id = 17

# *********************
# incident variables
# *********************
allowed_task_statuses = [constants.grouped_state, constants.resolved_state, constants.suppressed_state]
allowed_trigger_methods = [constants.app, constants.check, constants.email, constants.incidents_api,
                           constants.integrations_api, constants.internal, constants.live_call_routing, constants.web]

# these are the basic notification methods used to define notification rules;
# notification methods allowed through external integrations are not listed here
allowed_notification_methods = [constants.email, constants.app, constants.text, constants.call]


# ***************************
# API Integration configs
# ***************************

api_key_maximum_request_per_minute = 200
allowed_api_versions = [constants.api_version_incidents_one]
allowed_cdn_handled_integrations = [intt.google_chat, intt.microsoft_teams, intt.sentry, intt.slack]

# these are the only events that will be accepted through integrations
allowed_integration_events = [
    constants.acknowledge_event, constants.add_responders_event, constants.custom_action_event,
    constants.escalate_event, constants.notate_event, constants.reassign_event,
    constants.resolve_event, constants.snooze_event, constants.trigger_event,
    constants.un_acknowledge_event, constants.urgency_amendment_event
]

allowed_integration_types = [intt.amazon_cloud_watch, intt.appbeat, intt.appoptics, intt.app_dynamics, intt.autotask,
                             intt.aws_cloud_trail, intt.checkly, intt.custom_endpoint, intt.custom_integration,
                             intt.crowdstrike, intt.datadog, intt.dynatrace, intt.elasticsearch_watcher, intt.email,
                             intt.errorception, intt.freshdesk, intt.freshservice, intt.github, intt.gitlab,
                             intt.google_chat, intt.google_cloud_monitoring, intt.grafana, intt.haloitsm, 
                             intt.honeycomb, intt.icinga2, intt.instana, intt.jira_cloud, intt.jira_server, 
                             intt.kibana_alerting, intt.logdna, intt.loggly, intt.logic_monitor, intt.logrocket, 
                             intt.manage_engine_op_manager,
                             intt.manage_engine_service_desk_plus, intt.meraki, intt.microsoft_azure_alerts,
                             intt.microsoft_teams, intt.monday, intt.nagios, intt.new_relic, intt.n_central,
                             intt.observium, intt.orion, intt.pingdom, intt.prometheus, intt.prtg, intt.rollbar,
                             intt.rundeck, intt.runscope, intt.sentry, intt.servicenow, intt.site24x7, intt.slack,
                             intt.solarwinds_servicedesk, intt.splunk, intt.sumo_logic, intt.sysdig, intt.team_dynamix, intt.uptime_robot,
                             intt.webex, intt.zabbix, intt.zendesk, intt.zoom]

allowed_account_wide_integrations = [intt.servicenow]
allowed_auto_triggering_integrations = [intt.autotask, intt.freshdesk, intt.freshservice, intt.google_chat,
                                        intt.jira_cloud, intt.jira_server, intt.microsoft_teams, intt.monday,
                                        intt.rundeck, intt.slack, intt.solarwinds_servicedesk, intt.team_dynamix, intt.zendesk]
allowed_linkable_integrations = [intt.freshdesk, intt.zendesk]
allowed_recent_changes_integrations = [intt.github, intt.gitlab]
allowed_sso_types = [intt.azure_ad_sso, intt.google_sso, intt.okta, intt.saml]
allowed_temporary_token_verification_types = [intt.google_chat, intt.microsoft_teams]
supported_chat_integrations = [intt.google_chat, intt.microsoft_teams, intt.slack]

# ***********************
# login configs
# ***********************
allowed_failed_login_attempts = 5
allowed_failed_verification_attempts = 3
allowed_login_methods = [constants.app, constants.web, intt.freshdesk, intt.zendesk]
allowed_password_retrieval_attempts = 5
allowed_username_retrieval_attempts = 5


# Within these number of days there cannot be more failed attempts than what is allowed
failed_attempts_checking_minutes = 30


# subscriptions
free_subscription_id = 1
free_subscription_name = 'FREE'
starter_subscription_id = 2
starter_subscription_name = 'STARTER'
business_subscription_id = 3
business_subscription_name = 'BUSINESS'
digital_operations_subscription_id = 4
digital_operations_subscription_name = 'DIGITAL_OPERATIONS'

allowed_subscription_ids = [free_subscription_id, starter_subscription_id,
                            business_subscription_id, digital_operations_subscription_id]
subscription_name_id_map = {
    free_subscription_name: free_subscription_id,
    starter_subscription_name: starter_subscription_id,
    business_subscription_name: business_subscription_id,
    digital_operations_subscription_name: digital_operations_subscription_id
}
allowed_currencies = [constants.usd_curr, constants.eur_curr]

free_subscription_max_users = 5

# subscription add-ons
stakeholder_add_on_id = 5
live_call_routing_add_on_id = 6
sso_add_on_id = 12

# subscription supplements
tier_1_phone_numbers_supplement_id = 7
tier_2_phone_numbers_supplement_id = 8
live_call_minutes_us_canada_supplement_id = 9
live_call_minutes_international_supplement_id = 10
call_recording_supplement_id = 11
external_email_supplement_id = 13
external_sms_supplement_id = 14
checks_supplement_id = 15

# subscription ids eligible for discounts
discount_eligible_user_plan_subscription_ids = [starter_subscription_id, business_subscription_id,
                                                digital_operations_subscription_id]

# urgency levels -> 1: minor, 2: low, 3: medium, 4: high, 5: critical
allowed_urgency_levels = [constants.minor_urgency, constants.low_urgency, constants.medium_urgency,
                          constants.high_urgency, constants.critical_urgency]
default_urgency_level = constants.high_urgency


# ***************************
# length of variables
# ***************************
api_key_length = {constants.aws_europe_paris: 67, constants.aws_us_ohio: 73}
postmortem_report_reference_id_length = 8
temporary_token_length = 113


# ***************************
# organization configurations
# ***************************
allowed_sectors = [
    "Agriculture", "Banking", "Consulting", "Construction", "Education",
    "Engineering", "Entertainment", "Financial Services", "Food Processing", "Government",
    "Health Care", "Hospitality", "Insurance", "Information Technology", "Legal Services",
    "Manufacturing", "Pharmaceuticals", "Real Estate", "Retail Sales", "Telecommunication",
    "Transportation", "Others"
]
max_alerting_cost_percent_threshold = 70
max_idle_free_notification_cycle_count = 10
max_idle_paid_notification_cycle_count = 5
max_hourly_triggers = 8
max_avg_hourly_triggers_after_three_hours = 3
max_assignees_per_instance = 30
max_malicious_events = 4
max_malicious_events_paid_plans = 45
max_unresolved_period = 10  # days
blacklist_look_back_period = 15  # days
blacklist_notification_period = 2   # days


# *********************
# user verifications
# *********************
allowed_verification_types = [constants.new_account_verification, constants.password_reset_verification,
                              constants.account_closure_verification]
# for user registration
new_account_code_life_hours = 3

# analytics data types
allowed_analytics_assignee_type = [constants.user_assignee, constants.policy_assignee, constants.organization_assignee]

# standard timezone
standard_timezone = 'UTC'

# standard variables
standard_wait_minutes = 30

# standard day period starts (needed for user metrics)
daytime_hours = (datetime.time(7, 0), datetime.time(17, 59))
after_hours = (datetime.time(18, 0), datetime.time(23, 59))
sleep_hours = (datetime.time(0, 0), datetime.time(6, 59))

# acceptable/ideal metrics
below_ideal_effectiveness = 90
ideal_effectiveness = 98
ideal_daily_interruption_minutes = 60
ideal_daily_rest_minutes = 240
ideal_weekly_daytime_hours_incident_count = 9
ideal_weekly_after_hours_incident_count = 2
ideal_weekly_sleep_hours_incident_count = 1

# business impact metrics
standard_hourly_business_loss = 1000
standard_hourly_labor_cost = 50


# ***********************
# live call routing configs
# ***********************
allowed_live_call_routing_vendors = [constants.twilio]
allowed_live_call_statuses = [constants.answered_state, constants.blocked_state, constants.message_left_state,
                              constants.no_answer_state, constants.outgoing, constants.suppressed_state]
allowed_live_call_routing_countries = [
    'AR', 'AT', 'AU', 'BA', 'BB', 'BE', 'BG', 'BJ', 'BR', 'BW', 'CA', 'CH', 'CL', 'CO', 'CZ',
    'DE', 'DK', 'DO', 'DZ', 'EC', 'EE', 'FI', 'FR', 'GB', 'GD', 'GE', 'GH', 'GN', 'GR', 'HK',
    'HR', 'HU', 'ID', 'IE', 'IL', 'IS', 'IT', 'JM', 'JP', 'KE', 'KY', 'LT', 'LU', 'ML', 'MO',
    'MU', 'MX', 'NL', 'NZ', 'PA', 'PE', 'PH', 'PL', 'PR', 'PT', 'RO', 'SD', 'SE', 'SG', 'SI',
    'SK', 'SV', 'TH', 'TN', 'TT', 'UG', 'US', 'VE', 'VI', 'VN', 'ZA'
]
allowed_live_call_routing_languages = [constants.lang_en, constants.lang_es, constants.lang_de, constants.lang_fr]
approval_required_live_call_countries = [
    'AR', 'AT', 'BA', 'BB', 'BE', 'BG', 'BJ', 'BR', 'CH', 'CL', 'CO', 'CZ', 'DE', 'DK', 'DO',
    'DZ', 'EC', 'EE', 'FR', 'GB', 'GD', 'GH', 'GR', 'HK', 'HR', 'HU', 'ID', 'IT', 'JM', 'JP',
    'KE', 'LT', 'LU', 'ML', 'MO', 'MU', 'MX', 'NL', 'NZ', 'PA', 'PH', 'PL', 'PT', 'RO', 'SE',
    'SG', 'SI', 'SK', 'SV', 'TH', 'TN', 'UG', 'VE', 'VN', 'ZA'
]
call_recording_fee_per_minute = 0.05
call_routing_default_incident_urgency = constants.critical_urgency
call_routing_default_max_forwarding_users = 1
call_routing_default_max_forwarding_timeout_seconds = 20
call_routing_max_forwarding_timeout = 60
call_routing_max_options = 10
call_routing_max_voicemail_timeout = 60
call_routing_minutes_price_us_ca = 0.1
call_routing_minutes_price_international = 0.35
call_routing_us_min_minutes_for_volume_discount = 5000
call_routing_us_volume_discount_promotion_id = 1

#################################
# external communication configs
#################################
free_external_email_count = 3000

#################################
# monitor check configs
#################################
allowed_monitor_checks = [constants.heartbeat]
free_monitor_checks_count = 10000
monitor_checks_price = 0.5

#################################
# status page configs
#################################
status_page_business_service_statuses = [constants.partial_outage_state, constants.operational_state,
                                         constants.outage_state]
status_page_default_extensions = ['maintenance', 'past-incidents', 'subscription', 'subscriber', 'post']
status_page_impact_types = [constants.no_impact, constants.minor_impact, constants.major_impact]
status_page_incident_statuses = [constants.identified_state, constants.investigating_state, constants.monitoring_state,
                                 constants.resolved_state]
status_page_maintenance_statuses = [constants.completed_state, constants.in_progress_state, constants.scheduled_state,
                                    constants.verifying_state]
status_page_subscription_notification_methods = [constants.email, constants.text, constants.webhook, intt.slack]
