import json
import os
import socket
import sys

from buildbot.plugins import reporters, util
from datetime import timedelta

import loadConfig
from events import Events, GitHubEventHandlerNoEdits


def load_password(name, default=None):
    if os.getenv(name):
        return os.getenv(name)
    try:
        passwords = json.load(open('passwords.json'))
        return passwords.get(name, default)
    except Exception as e:
        print('Error in finding {} in passwords.json'.format(name))
        return default


# This is work-around for Twisted having a small size limit for patches. See https://bugs.webkit.org/show_bug.cgi?id=198851#c5
from twisted.spread import banana
banana.SIZE_LIMIT = 100 * 1024 * 1024

# This is work-around for https://bugs.webkit.org/show_bug.cgi?id=222361
from buildbot.process.buildstep import BuildStep
BuildStep.warn_deprecated_if_oldstyle_subclass = lambda self, name: None

is_test_mode_enabled = load_password('BUILDBOT_PRODUCTION') is None
custom_suffix = '-uat' if load_password('BUILDBOT_UAT') else ''

c = BuildmasterConfig = {}

c['www'] = dict(port='tcp:8010:interface=127.0.0.1', allowed_origins=["*"])
c['www']['custom_templates_dir'] = 'templates'

c['www']['ui_default_config'] = { 
    'Builders.show_workers_name': True,
    'Builders.buildFetchLimit': 1000,
    'Workers.showWorkerBuilders': True,
}
c['www']['change_hook_dialects'] = dict(
    github={
        'class': GitHubEventHandlerNoEdits,
        'secret': load_password('GITHUB_HOOK_SECRET'),
        'github_property_whitelist': [
            'github.number',
            'github.title',
            'github.head.ref',
            'github.head.sha',
            'github.base.sha',
            'github.head.repo.full_name',
        ], 'token': load_password('GITHUB_COM_ACCESS_TOKEN'),
    },
)

if not is_test_mode_enabled:
    credentials = load_password('EWS_CREDENTIALS')
    if not credentials:
        print('EWS credentials not found. Please ensure EWS_CREDENTIALS is configured either in env variables or in passwords.json')
        sys.exit(1)
    # See https://docs.buildbot.net/current/manual/configuration/www.html#example-configs
    authz = util.Authz(
        allowRules=[util.AnyControlEndpointMatcher(role="admin")],
        roleMatchers=[util.RolesFromEmails(admin=list(credentials.keys()))]
    )
    auth = util.UserPasswordAuth(credentials)
    c['www']['auth'] = auth
    c['www']['authz'] = authz

c['protocols'] = {'pb': {'port': 17000}}

c['projectName'] = 'WebKit EWS{}'.format(custom_suffix.upper())
c['projectURL'] = 'https://ews-build.webkit{}.org/'.format(custom_suffix)

if is_test_mode_enabled:
    c['buildbotURL'] = 'http://localhost:8010/'
    c['db_url'] = 'sqlite:///state.sqlite?serialize_access=1'
else:
    c['buildbotURL'] = 'https://ews-build.webkit{}.org/'.format(custom_suffix)
    db_url = load_password('DB_URL', None)
    db_name = load_password('DB_NAME', None)
    db_username = load_password('DB_USERNAME', None)
    db_password = load_password('DB_PASSWORD', None)
    if None in [db_url, db_name, db_username, db_password]:
        print('Environment variables for DB not found. Please ensure these variables are set.')
        sys.exit(1)
    # See https://docs.buildbot.net/1.7.0/manual/configuration/global.html#database-specification
    c['db_url'] = 'postgresql://{}:{}@{}/{}'.format(db_username, db_password, db_url, db_name)
    # configure a janitor to delete old logs
    c['configurators'] = [util.JanitorConfigurator(logHorizon=timedelta(weeks=52), hour='1', dayOfWeek='*')]

c['logCompressionMethod'] = 'lz4'
c['buildbotNetUsageData'] = None

loadConfig.loadBuilderConfig(c, is_test_mode_enabled=is_test_mode_enabled)

mail_notifier = reporters.MailNotifier(
    fromaddr='ews-build@webkit.org',
    sendToInterestedUsers=False,
    extraRecipients=['webkit-ews-bot-watchers@group.apple.com'],
    mode=('exception'),
    addPatch=False)

if not is_test_mode_enabled:
    hostname =  socket.gethostname().strip()
    event_reporter = Events(master_hostname=hostname, type_prefix='ews')
    c['services'] = [event_reporter, mail_notifier]
