/**
    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.
*/

const path = require('node:path');
const rewire = require('rewire');
const util = require('../../src/cordova/util');
const prepare = rewire('../../src/cordova/prepare');
const restore = require('../../src/cordova/restore-util');
const platforms = require('../../src/platforms/platforms');
const HooksRunner = require('../../src/hooks/HooksRunner');
const PlatformJson = require('cordova-common').PlatformJson;

const project_dir = '/some/path';

describe('cordova/prepare', function () {
    let platform_api_prepare_mock;
    let platform_api_add_mock;
    let platform_api_remove_mock;
    beforeEach(function () {
        platform_api_prepare_mock = jasmine.createSpy('prepare').and.returnValue(Promise.resolve());
        platform_api_add_mock = jasmine.createSpy('add').and.returnValue(Promise.resolve());
        platform_api_remove_mock = jasmine.createSpy('remove').and.returnValue(Promise.resolve());
        spyOn(platforms, 'getPlatformApi').and.callFake(function (platform, rootDir) {
            return {
                prepare: platform_api_prepare_mock,
                getPlatformInfo: jasmine.createSpy('getPlatformInfo').and.returnValue({
                    locations: {
                        www: path.join(project_dir, 'platforms', platform, 'www')
                    }
                }),
                removePlugin: platform_api_add_mock,
                addPlugin: platform_api_remove_mock
            };
        });
        spyOn(PlatformJson, 'load');
        spyOn(HooksRunner.prototype, 'fire').and.returnValue(Promise.resolve());
        spyOn(util, 'isCordova').and.returnValue(true);
    });

    describe('main method', function () {
        beforeEach(function () {
            spyOn(restore, 'installPlatformsFromConfigXML').and.returnValue(Promise.resolve());
            spyOn(restore, 'installPluginsFromConfigXML').and.returnValue(Promise.resolve());
            spyOn(util, 'cdProjectRoot').and.returnValue(project_dir);
            spyOn(util, 'preProcessOptions').and.callFake(function (options) {
                const platforms = options.platforms || [];
                return { platforms };
            });
            spyOn(prepare, 'preparePlatforms').and.returnValue(Promise.resolve());
        });
        describe('failure', function () {
            it('should invoke util.preProcessOptions as preflight task checker, which, if fails, should trigger promise rejection and only fire the before_prepare hook', async function () {
                util.preProcessOptions.and.callFake(function () {
                    throw new Error('preProcessOption error');
                });

                await expectAsync(
                    prepare({})
                ).toBeRejectedWithError('preProcessOption error');

                expect(HooksRunner.prototype.fire).toHaveBeenCalledWith('before_prepare', jasmine.any(Object));
            });
            it('should invoke util.cdProjectRoot as a preflight task checker, which, if fails, should trigger a promise rejection and fire no hooks', async function () {
                util.cdProjectRoot.and.callFake(function () {
                    throw new Error('cdProjectRoot error');
                });

                await expectAsync(
                    prepare({})
                ).toBeRejectedWithError('cdProjectRoot error');

                expect(HooksRunner.prototype.fire).not.toHaveBeenCalled();
            });
        });

        describe('success', function () {
            it('should fire the before_prepare hook and provide platform and path information as arguments', function () {
                return prepare({}).then(function () {
                    expect(HooksRunner.prototype.fire).toHaveBeenCalledWith('before_prepare', jasmine.any(Object));
                });
            });
            it('should invoke restore module\'s installPlatformsFromConfigXML method', function () {
                return prepare({}).then(function () {
                    expect(restore.installPlatformsFromConfigXML).toHaveBeenCalled();
                });
            });
            it('should retrieve PlatformApi instances for each platform provided', function () {
                return prepare({ platforms: ['android', 'ios'] }).then(function () {
                    expect(platforms.getPlatformApi).toHaveBeenCalledTimes(4);
                    // expect(platforms.getPlatformApi).toHaveBeenCalledWith(['android', path.join('some','path','platforms','android')], ['ios', path.join('some','path','platforms','ios')], ['android'], ['ios']);
                    expect(platforms.getPlatformApi).toHaveBeenCalledWith('android', path.join('/', 'some', 'path', 'platforms', 'android'));
                    expect(platforms.getPlatformApi).toHaveBeenCalledWith('ios', path.join('/', 'some', 'path', 'platforms', 'ios'));
                    expect(platforms.getPlatformApi).toHaveBeenCalledWith('android');
                    expect(platforms.getPlatformApi).toHaveBeenCalledWith('ios');
                });
            });
            it('should invoke restore module\'s installPluginsFromConfigXML method', function () {
                return prepare({ platforms: [] }).then(function () {
                    expect(restore.installPluginsFromConfigXML).toHaveBeenCalled();
                });
            });
            it('should invoke preparePlatforms method, providing the appropriate platforms', function () {
                return prepare({ platforms: ['android'] }).then(function () {
                    expect(prepare.preparePlatforms).toHaveBeenCalledWith(['android'], '/some/path', jasmine.any(Object));
                });
            });
            it('should fire the after_prepare hook and provide platform and path information as arguments', function () {
                return prepare({ platforms: ['android'] }).then(function () {
                    expect(HooksRunner.prototype.fire).toHaveBeenCalledWith('after_prepare', jasmine.any(Object));
                });
            });
        });
    });
});
