using System;
using System.IO;
using System.Linq;
using System.Reflection;
using UnityEngine;

namespace Packages.Rider.Editor
{
    internal class RiderInitializer
    {
      public void Initialize(string editorPath)
      {
        if (EditorPluginInterop.EditorPluginIsLoadedFromAssets())
        {
          Debug.LogError($"Please delete {EditorPluginInterop.GetEditorPluginAssembly().Location}. Unity 2019.2+ loads it directly from Rider installation.");
          return;
        }

        var dllName = "JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked.dll";
        var relPath = "../../plugins/rider-unity/EditorPlugin";
        if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX)
          relPath = "Contents/plugins/rider-unity/EditorPlugin";
        var dllFile = new FileInfo(Path.Combine(Path.Combine(editorPath, relPath), dllName));

        if (dllFile.Exists)
        {
          // doesn't lock assembly on disk
          var bytes = File.ReadAllBytes(dllFile.FullName);
          var pdbFile = new FileInfo(Path.ChangeExtension(dllFile.FullName, ".pdb"));
          if (pdbFile.Exists)
          {
            AppDomain.CurrentDomain.Load(bytes, File.ReadAllBytes(pdbFile.FullName));  
          }
          else
          {
            AppDomain.CurrentDomain.Load(bytes);
            // AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(dllFile.FullName)); // use this for external source debug
          }
          EditorPluginInterop.InitEntryPoint();
        }
        else
        {
          Debug.Log((object) ($"Unable to find Rider EditorPlugin {dllFile.FullName} for Unity "));
        }
      }
    }
}
