using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Host.Mef;
//using Microsoft.CodeAnalysis.Text;
//using OmniSharp.Roslyn;
using Microsoft.DotNet.ProjectModel.Server.Models;
using MonoDevelop.Dnx;
using OmniSharp.Dnx;

namespace OmniSharp
{
    public class OmnisharpWorkspace : Workspace
    {
//        public bool Initialized { get; set; }
//
//        public BufferManager BufferManager { get; private set; }
//
        public OmnisharpWorkspace() : this(MefHostServices.DefaultHost)
        {
        }

        public OmnisharpWorkspace(MefHostServices hostServices) : base(hostServices, "Custom")
        {
//            BufferManager = new BufferManager(this);
        }

        public void AddProject(ProjectInfo projectInfo)
        {
            OnProjectAdded(projectInfo);
        }

        public void AddProjectReference(ProjectId projectId, ProjectReference projectReference)
        {
            OnProjectReferenceAdded(projectId, projectReference);
        }

        public void RemoveProjectReference(ProjectId projectId, ProjectReference projectReference)
        {
            OnProjectReferenceRemoved(projectId, projectReference);
        }

        public void AddMetadataReference(ProjectId projectId, MetadataReference metadataReference)
        {
            OnMetadataReferenceAdded(projectId, metadataReference);
        }

        public void RemoveMetadataReference(ProjectId projectId, MetadataReference metadataReference)
        {
            OnMetadataReferenceRemoved(projectId, metadataReference);
        }

//        public void AddDocument(DocumentInfo documentInfo)
//        {
//            OnDocumentAdded(documentInfo);
//        }
//
//        public void RemoveDocument(DocumentId documentId)
//        {
//            OnDocumentRemoved(documentId);
//        }

        public void RemoveProject(ProjectId projectId)
        {
            OnProjectRemoved(projectId);
        }

        public void SetCompilationOptions(ProjectId projectId, CompilationOptions options)
        {
            OnCompilationOptionsChanged(projectId, options);
        }

        public void SetParseOptions(ProjectId projectId, ParseOptions parseOptions)
        {
            OnParseOptionsChanged(projectId, parseOptions);
        }

//        public void OnDocumentChanged(DocumentId documentId, SourceText text)
//        {
//            OnDocumentTextChanged(documentId, text, PreservationMode.PreserveIdentity);
//        }
//
//        public DocumentId GetDocumentId(string filePath)
//        {
//            var documentIds = CurrentSolution.GetDocumentIdsWithFilePath(filePath);
//            return documentIds.FirstOrDefault();
//        }
//
//        public IEnumerable<Document> GetDocuments(string filePath)
//        {
//            return CurrentSolution.GetDocumentIdsWithFilePath(filePath).Select(id => CurrentSolution.GetDocument(id));
//        }
//
//        public Document GetDocument(string filePath)
//        {
//            var documentId = GetDocumentId(filePath);
//            if (documentId == null)
//            {
//                return null;
//            }
//            return CurrentSolution.GetDocument(documentId);
//        }
//
//        public override bool CanApplyChange(ApplyChangesKind feature)
//        {
//            return true;
//        }

        public void DependenciesUpdated(OmniSharp.Dnx.Project project, DependenciesMessage message)
        {
            DnxServices.ProjectService.DependenciesUpdated(project, message);
        }

        public void ReportDiagnostics(OmniSharp.Dnx.Project project, DiagnosticsListMessage message)
        {
            DnxServices.ProjectService.ReportDiagnostics(project, message);
        }

        public void ReferencesUpdated (ProjectId projectId, FrameworkProject frameworkProject)
        {
            DnxServices.ProjectService.OnReferencesUpdated (projectId, frameworkProject);
        }

        public void CompilationOptionsChanged (ProjectId projectId, CSharpCompilationOptions options, CSharpParseOptions parseOptions)
        {
            DnxServices.ProjectService.OnCompilationOptionsChanged (projectId, options, parseOptions);
        }
    }
}
