/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file 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.
*/

var platforms = require('../../platforms'),
    util = require('../../src/util'),
    path = require('path'),
    shell = require('shelljs'),
    fs = require('fs'),
    ET = require('elementtree'),
    config = require('../../src/config'),
    prompt = require('prompt'),
    config_parser = require('../../src/config_parser'),
    cordova = require('../../cordova');

describe('blackberry project parser', function() {
    var proj = '/some/path';
    var exists, custom, config_p, sh;
    beforeEach(function() {
        exists = spyOn(fs, 'existsSync').andReturn(true);
        custom = spyOn(config, 'has_custom_path').andReturn(false);
        config_p = spyOn(util, 'config_parser');
        sh = spyOn(shell, 'exec').andCallFake(function(cmd, opts, cb) {
            cb(0, '');
        });
    });

    describe('constructions', function() {
        it('should throw an exception with a path that is not a native blackberry project', function() {
            exists.andReturn(false);
            expect(function() {
                new platforms.blackberry.parser(proj);
            }).toThrow('The provided path "/some/path" is not a Cordova BlackBerry10 project.');
        });
        it('should accept a proper native blackberry project path as construction parameter', function() {
            var project;
            expect(function() {
                project = new platforms.blackberry.parser(proj);
            }).not.toThrow();
            expect(project).toBeDefined();
        });
    });

    describe('check_requirements', function() {
        it('should fire a callback if the blackberry-deploy shell-out fails', function(done) {
            sh.andCallFake(function(cmd, opts, cb) {
                cb(1, 'no bb-deploy dewd!');
            });
            platforms.blackberry.parser.check_requirements(proj, function(err) {
                expect(err).toContain('no bb-deploy dewd');
                done();
            });
        });
        it('should fire a callback with no error if shell out is successful', function(done) {
            platforms.blackberry.parser.check_requirements(proj, function(err) {
                expect(err).toEqual(false);
                done();
            });
        });
    });
    describe('instance', function() {
        var p, cp, rm, is_cordova, write, read;
        var bb_proj = path.join(proj, 'platforms', 'blackberry');
        beforeEach(function() {
            p = new platforms.blackberry.parser(bb_proj);
            cp = spyOn(shell, 'cp');
            rm = spyOn(shell, 'rm');
            is_cordova = spyOn(util, 'isCordova').andReturn(proj);
            write = spyOn(fs, 'writeFileSync');
            read = spyOn(fs, 'readFileSync');
        });

        describe('update_from_config method', function() {
            var et, xml, find, write_xml, root, cfg, find_obj, root_obj;
            var xml_name, xml_pkg, xml_version, xml_access_rm, xml_update, xml_append;
            beforeEach(function() {
                xml_name = jasmine.createSpy('xml name');
                xml_pkg = jasmine.createSpy('xml pkg');
                xml_version = jasmine.createSpy('xml version');
                xml_access_rm = jasmine.createSpy('xml access rm');
                xml_update = jasmine.createSpy('xml update');
                xml_append = jasmine.createSpy('xml append');
                p.xml.name = xml_name;
                p.xml.packageName = xml_pkg;
                p.xml.version = xml_version;
                p.xml.access = {
                    remove:xml_access_rm
                };
                p.xml.update = xml_update;
                p.xml.doc = {
                    getroot:function() { return { append:xml_append}; }
                };
                find_obj = {
                    text:'hi'
                };
                root_obj = {
                    attrib:{
                        package:'bb_pkg'
                    }
                };
                find = jasmine.createSpy('ElementTree find').andReturn(find_obj);
                write_xml = jasmine.createSpy('ElementTree write');
                root = jasmine.createSpy('ElementTree getroot').andReturn(root_obj);
                et = spyOn(ET, 'ElementTree').andReturn({
                    find:find,
                    write:write_xml,
                    getroot:root
                });
                xml = spyOn(ET, 'XML');
                cfg = new config_parser();
                cfg.name = function() { return 'testname' };
                cfg.packageName = function() { return 'testpkg' };
                cfg.version = function() { return 'one point oh' };
                cfg.access.get = function() { return [] };
                cfg.preference.get = function() { return [] };
            });

            it('should write out the app name to config.xml', function() {
                p.update_from_config(cfg);
                expect(xml_name).toHaveBeenCalledWith('testname');
            });
            it('should write out the app id to bb\'s config.xml', function() {
                p.update_from_config(cfg);
                expect(xml_pkg).toHaveBeenCalledWith('testpkg');
            });
            it('should write out the app version to bb\'s config.xml', function() {
                p.update_from_config(cfg);
                expect(xml_version).toHaveBeenCalledWith('one point oh');
            });
            it('should wipe out the bb config.xml whitelist every time', function() {
                p.update_from_config(cfg);
                expect(xml_access_rm).toHaveBeenCalled();
            });
            it('should update the whitelist', function() {
                cfg.access.get = function() { return ['one'] };
                p.update_from_config(cfg);
                expect(xml_append.mostRecentCall.args[0].attrib.uri).toEqual('one');
            });
        });
        describe('www_dir method', function() {
            it('should return /www', function() {
                expect(p.www_dir()).toEqual(path.join(bb_proj, 'www'));
            });
        });
        describe('staging_dir method', function() {
            it('should return .staging/www', function() {
                expect(p.staging_dir()).toEqual(path.join(bb_proj, '.staging', 'www'));
            });
        });
        describe('config_xml method', function() {
            it('should return the location of the config.xml', function() {
                expect(p.config_xml()).toEqual(path.join(proj, 'platforms', 'blackberry', 'www', 'config.xml'));
            });
        });
        describe('update_www method', function() {
            it('should rm project-level www and cp in platform agnostic www', function() {
                p.update_www();
                expect(rm).toHaveBeenCalled();
                expect(cp).toHaveBeenCalled();
            });
            it('should copy in a fresh cordova.js from stock cordova lib if no custom lib is specified', function() {
                p.update_www();
                expect(cp).toHaveBeenCalledWith('-f', path.join(util.libDirectory, 'blackberry', 'cordova', platforms.blackberry.version, 'javascript', 'cordova.blackberry10.js'), path.join(proj, 'platforms', 'blackberry', 'www', 'cordova.js'));
            });
            it('should copy in a fresh cordova.js from custom cordova lib if custom lib is specified', function() {
                var custom_path = '/custom/path';
                custom.andReturn(custom_path);
                p.update_www();
                expect(cp).toHaveBeenCalledWith('-f', path.join(custom_path, 'javascript', 'cordova.blackberry10.js'), path.join(proj, 'platforms', 'blackberry', 'www', 'cordova.js'));
            });
        });
        describe('update_overrides method', function() {
            it('should do nothing if merges directory does not exist', function() {
                exists.andReturn(false);
                p.update_overrides();
                expect(cp).not.toHaveBeenCalled();
            });
            it('should copy merges path into www', function() {
                p.update_overrides();
                expect(cp).toHaveBeenCalledWith('-rf', path.join(proj, 'merges', 'blackberry', '*'), path.join(proj, 'platforms', 'blackberry', 'www'));
            });
        });
        describe('update_staging method', function() {
            it('should do nothing if staging dir does not exist', function() {
                exists.andReturn(false);
                p.update_staging();
                expect(cp).not.toHaveBeenCalled();
            });
            it('should copy the staging dir into www if staging dir exists', function() {
                p.update_staging();
                expect(cp).toHaveBeenCalledWith('-rf', path.join(proj, 'platforms', 'blackberry', '.staging', 'www', '*'), path.join(proj, 'platforms', 'blackberry', 'www'));
            });
        });
        describe('update_project method', function() {
            var config, www, overrides, staging, svn, parse, get_env, write_env;
            beforeEach(function() {
                config = spyOn(p, 'update_from_config');
                www = spyOn(p, 'update_www');
                overrides = spyOn(p, 'update_overrides');
                staging = spyOn(p, 'update_staging');
                svn = spyOn(util, 'deleteSvnFolders');
                parse = spyOn(JSON, 'parse').andReturn({blackberry:{qnx:{}}});
                get_env = spyOn(p, 'get_blackberry_environment');
                set_env = spyOn(p, 'write_blackberry_environment');
            });
            it('should call update_from_config', function() {
                p.update_project();
                expect(config).toHaveBeenCalled();
            });
            it('should throw if update_from_config throws', function(done) {
                var err = new Error('uh oh!');
                config.andCallFake(function() { throw err; });
                p.update_project({}, function(err) {
                    expect(err).toEqual(err);
                    done();
                });
            });
            it('should call update_www', function() {
                p.update_project();
                expect(www).toHaveBeenCalled();
            });
            it('should call update_overrides', function() {
                p.update_project();
                expect(overrides).toHaveBeenCalled();
            });
            it('should call update_staging', function() {
                p.update_project();
                expect(staging).toHaveBeenCalled();
            });
            it('should call deleteSvnFolders', function() {
                p.update_project();
                expect(svn).toHaveBeenCalled();
            });
            it('should always write out the bb env', function() {
                p.update_project();
                expect(set_env).toHaveBeenCalled();
            });
            it('should retrieve then write out the bb env if it is empty', function() {
                parse.andReturn({});
                get_env.andCallFake(function(cb) { cb(); });
                p.update_project();
                expect(get_env).toHaveBeenCalled();
                expect(set_env).toHaveBeenCalled();
            });
        });
        describe('get_blackberry_environment method', function() {
            var parse, promptspy;
            var random_info = {
                signing_password:'poop',
                device_ip:'1.1.1.1',
                device_name:'black shadow',
                device_password:'giddyup',
                device_pin:'dont have one',
                sim_ip:'1.2.3.4',
                sim_name:'data',
                sim_password:'modem'
            };
            beforeEach(function() {
                parse = spyOn(JSON, 'parse').andReturn({blackberry:{qnx:{
                }}});
                spyOn(prompt, 'start');
                promptspy = spyOn(prompt, 'get').andCallFake(function(ps, cb) {
                    cb(false, random_info);
                });
            });
            it('should call into prompt to retrieve info about BB env', function(done) {
                p.get_blackberry_environment(function(err) {
                    expect(promptspy).toHaveBeenCalled();
                    done();
                });
            });
            it('should write out info gathered from prompt to dot file', function(done) {
                var expected_json = {blackberry:{qnx:random_info}};
                p.get_blackberry_environment(function(err, results) {
                    expect(write).toHaveBeenCalledWith(path.join(proj, '.cordova', 'config.json'), JSON.stringify(expected_json), 'utf-8');
                    done();
                });
            });
        });
    });
});
