'use strict';

var MockModels = {
    inject: function () {
        beforeEach(function () {
            AnalysisTask._fetchAllPromise = null;
            AnalysisTask.clearStaticMap();
            CommitLog.clearStaticMap();
            Metric.clearStaticMap();
            Platform.clearStaticMap();
            Repository.clearStaticMap();
            CommitSet.clearStaticMap();
            Test.clearStaticMap();
            TestGroup.clearStaticMap();
            BuildRequest.clearStaticMap();
            Triggerable.clearStaticMap();
            TriggerableConfiguration.clearStaticMap();
            UploadedFile.clearStaticMap();
            MeasurementSet._setMap = null;

            MockModels.osx = Repository.ensureSingleton(9, {name: 'OS X'});
            MockModels.ios = Repository.ensureSingleton(22, {name: 'iOS'});
            MockModels.webkit = Repository.ensureSingleton(11, {name: 'WebKit', url: 'http://trac.webkit.org/changeset/$1'});
            MockModels.ownedWebkit = Repository.ensureSingleton(191, {name: 'WebKit', url: 'http://trac.webkit.org/changeset/$1', owner: 9});
            MockModels.sharedRepository = Repository.ensureSingleton(16, {name: 'Shared'});
            MockModels.ownerRepository = Repository.ensureSingleton(111, {name: 'Owner Repository'});
            MockModels.ownedRepository = Repository.ensureSingleton(112, {name: 'Owned Repository', owner: 111});
            MockModels.webkitGit = Repository.ensureSingleton(17, {name: 'WebKit-Git', blameUrl: 'https://commits.webkit.org/compare/$1...$2'});
            MockModels.builder = new Builder(176, {name: 'WebKit Perf Builder', buildUrl: 'http://build.webkit.org/builders/$builderName/$buildTag'});

            MockModels.someTest = Test.ensureSingleton(1, {name: 'Some test'});
            MockModels.someMetric = Metric.ensureSingleton(2884, {name: 'Some metric', test: MockModels.someTest});
            MockModels.somePlatform = Platform.ensureSingleton(65, {name: 'Some platform', metrics: [MockModels.someMetric],
                lastModifiedByMetric: {'2884': 5000, '1158': 5000}});

            MockModels.speedometer = Test.ensureSingleton(1928, {name: 'Speedometer'});
            MockModels.jetstream = Test.ensureSingleton(1886, {name: 'JetStream'});
            MockModels.dromaeo = Test.ensureSingleton(2022, {name: 'Dromaeo'});
            MockModels.domcore = Test.ensureSingleton(2023, {name: 'DOM Core Tests', parentId: 2022});

            MockModels.iphone = Platform.ensureSingleton(12, {name: 'iPhone', metrics: []});
            MockModels.ipad = Platform.ensureSingleton(13, {name: 'iPad', metrics: []});
            MockModels.iOS10iPhone = Platform.ensureSingleton(14, {name: 'iOS 10 iPhone', metrics: []});

            MockModels.plt = Test.ensureSingleton(844, {name: 'Page Load Test'});
            MockModels.iPadPLT = Test.ensureSingleton(1444, {name: 'PLT-iPad'});
            MockModels.iPhonePLT = Test.ensureSingleton(1500, {name: 'PLT-iPhone'});
            MockModels.pltMean = Metric.ensureSingleton(1158, {name: 'Time', aggregator: 'Arithmetic', test: MockModels.plt});
            MockModels.elCapitan = Platform.ensureSingleton(31, {name: 'El Capitan', metrics: [MockModels.pltMean]});

            MockModels.osRepositoryGroup = new TriggerableRepositoryGroup(31, {
                name: 'ios',
                repositories: [{repository: MockModels.ios}]
            });
            MockModels.svnRepositoryGroup = new TriggerableRepositoryGroup(32, {
                name: 'ios-svn-webkit',
                repositories: [{repository: MockModels.ios}, {repository: MockModels.webkit, acceptsPatch: true}, {repository: MockModels.sharedRepository}],
                acceptsCustomRoots: true,
            });
            MockModels.gitRepositoryGroup = new TriggerableRepositoryGroup(33, {
                name: 'ios-git-webkit',
                repositories: [{repository: MockModels.ios}, {repository: MockModels.webkitGit}, {repository: MockModels.sharedRepository}]
            });
            MockModels.svnRepositoryWithOwnedRepositoryGroup = new TriggerableRepositoryGroup(34, {
                name: 'ios-svn-webkit-with-owned-commit',
                repositories: [{repository: MockModels.ios}, {repository: MockModels.webkit, acceptsPatch: true}, {repository: MockModels.ownerRepository}],
                acceptsCustomRoots: true,
            });
            MockModels.ownerRepositoryGroup = new TriggerableRepositoryGroup(35, {
                name: 'owner-repository',
                repositories: [{repository: MockModels.ownerRepository}],
                acceptsCustomRoots: true
            });
            MockModels.triggerable = new Triggerable(3, {name: 'build-webkit',
                repositoryGroups: [MockModels.osRepositoryGroup, MockModels.svnRepositoryGroup, MockModels.gitRepositoryGroup, MockModels.svnRepositoryWithOwnedRepositoryGroup, MockModels.ownerRepositoryGroup],
                configurations: [{test: MockModels.iPhonePLT, platform: MockModels.iphone, supportedRepetitionTypes: ['alternating', 'sequential']}]});

            MockModels.someTriggableConfiguration = TriggerableConfiguration.findByTestAndPlatform(MockModels.iPhonePLT, MockModels.iphone);
        });
    }
}

if (typeof module != 'undefined')
    module.exports.MockModels = MockModels;
