// Copyright 2017 Google Inc. All rights reserved.
//
// Licensed 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 permissioßns and
// limitations under the License.

// This script only works in Unity 5.6 or newer since older versions of Unity
// don't have IPreprocessBuild and IPostprocessBuild.

#if UNITY_5_6_OR_NEWER && UNITY_ANDROID
using System;
using UnityEditor;
using UnityEditor.Build;
using UnityEngine;
using UnityEditorInternal.VR;

class MyCustomBuildProcessor : IPreprocessBuild, IPostprocessBuild
{
    private const string SCENE_NAME_PERMISSIONS_DEMO = "PermissionsDemo";
    private const string VR_DEVICE_CARDBOARD = "cardboard";
    private const string VR_DEVICE_DAYDREAM = "daydream";

    private bool m_cardboardAddedFromCode = false;

    public int callbackOrder
    {
        get { return 0; }
    }

    // OnPreprocessBuild() is called rigth before the build process begins. If it
    // detects that the first enabled scene in the build arrays is the PermissionsDemo,
    // and Daydream is in the VR SDKs, it will add Cardboard to the VR SDKs. Because
    // the PermissionsDemo needs a perm statement in the Manifest while other demos don't.
    // Adding Cardboard to VR SDKs will merge in the Manifest-Cardboard which has perm
    // statemetn in it.
    public void OnPreprocessBuild(BuildTarget target, string path)
    {
        m_cardboardAddedFromCode = false;

        string[] androidVrSDKs = VREditor.GetVREnabledDevicesOnTargetGroup(BuildTargetGroup.Android);

        EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes;

        // See if PermissionsDemo is the first enabled scene in the array of scenes to build.
        for (int i = 0; i < scenes.Length; i++)
        {
            if (scenes[i].path.Contains(SCENE_NAME_PERMISSIONS_DEMO))
            {
                if (!scenes[i].enabled)
                {
                    return;
                }
                else
                {
                    break;
                }
            }
            else
            {
                if (scenes[i].enabled)
                {
                    return;
                }
            }
        }

        bool hasCardboard = Array.Exists<string>(androidVrSDKs,
            element => element.Equals(VR_DEVICE_CARDBOARD));

        if (hasCardboard)
        {
            return;
        }

        bool hasDaydream = Array.Exists<string>(androidVrSDKs,
            element => element.Equals(VR_DEVICE_DAYDREAM));

        if (!hasDaydream)
        {
            return;
        }

        string[] androidVrSDKsAppended = new string[androidVrSDKs.Length+1];

        for (int i = 0; i < androidVrSDKs.Length; i++)
        {
            androidVrSDKsAppended[i] = androidVrSDKs[i];
        }

        androidVrSDKsAppended[androidVrSDKsAppended.Length - 1] = VR_DEVICE_CARDBOARD;

        VREditor.SetVREnabledOnTargetGroup(
            BuildTargetGroup.Android, true);
        VREditor.SetVREnabledDevicesOnTargetGroup(
            BuildTargetGroup.Android,
            androidVrSDKsAppended);

        m_cardboardAddedFromCode = true;
    }

    // OnPostprocessBuild() is called after the build process. It does appropriate cleanup
    // so that this script only affects build process for PermissionsDemo, not others.
    public void OnPostprocessBuild(BuildTarget target, string path)
    {
        if (!m_cardboardAddedFromCode)
            return;

        string[] androidVrSDKs = VREditor.GetVREnabledDevicesOnTargetGroup(BuildTargetGroup.Android);

        // The enabled devices are modified somehow, which shoudln't happen. Abort the post build process.
        if (androidVrSDKs.Length == 0 || androidVrSDKs[androidVrSDKs.Length - 1] != VR_DEVICE_CARDBOARD)
        {
            return;
        }

        string[] androidVrSDKsShortened = new string[androidVrSDKs.Length - 1];

        for (int i = 0; i < androidVrSDKsShortened.Length; i++)
        {
            androidVrSDKsShortened[i] = androidVrSDKs[i];
        }

        VREditor.SetVREnabledOnTargetGroup(
            BuildTargetGroup.Android, true);
        VREditor.SetVREnabledDevicesOnTargetGroup(
            BuildTargetGroup.Android,
            androidVrSDKsShortened);

        m_cardboardAddedFromCode = false;
    }
}
#endif  // UNITY_5_6_OR_NEWER