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

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Org.Apache.REEF.Tang.Annotations;

namespace Org.Apache.REEF.IO.FileSystem.Local
{
    /// <summary>
    /// An implementation of IFileSystem on the filesystem of the host.
    /// </summary>
    internal sealed class LocalFileSystem : IFileSystem
    {
        [Inject]
        private LocalFileSystem()
        {
        }

        /// <summary>
        /// Create Uri from given file name
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public Uri CreateUriForPath(string path)
        {
            if (path == null)
            {
                throw new ArgumentException("null path passed in CreateUriForPath");
            }

            return new Uri(path);
        }

        /// <summary>
        /// Gets the FileStatus for given file.
        /// </summary>
        /// <param name="remoteFileUri"></param>
        /// <exception cref="ArgumentNullException">If file URI is null</exception>
        /// <returns>FileStatus</returns>
        public FileStatus GetFileStatus(Uri remoteFileUri)
        {
            if (remoteFileUri == null)
            {
                throw new ArgumentNullException("remoteFileUri");
            }

            FileInfo fileInfo = new FileInfo(remoteFileUri.LocalPath);
            return new FileStatus(fileInfo.LastWriteTime, fileInfo.Length);
        }

        public Stream Open(Uri fileUri)
        {
            return File.Open(fileUri.LocalPath, FileMode.Open);
        }

        public Stream Create(Uri fileUri)
        {
            return File.Open(fileUri.LocalPath, FileMode.Create);
        }

        public void Delete(Uri fileUri)
        {
            File.Delete(fileUri.LocalPath);
        }

        public bool Exists(Uri fileUri)
        {
            return File.Exists(fileUri.LocalPath);
        }

        public void Copy(Uri sourceUri, Uri destinationUri)
        {
            File.Copy(sourceUri.LocalPath, destinationUri.LocalPath);
        }

        public void CopyToLocal(Uri remoteFileUri, string localName)
        {
            File.Copy(remoteFileUri.LocalPath, localName);
        }

        public void CopyFromLocal(string localFileName, Uri remoteFileUri)
        {
            File.Copy(localFileName, remoteFileUri.LocalPath);
        }

        public void CreateDirectory(Uri directoryUri)
        {
            Directory.CreateDirectory(directoryUri.LocalPath);
        }

        public void DeleteDirectory(Uri directoryUri)
        {
            Directory.Delete(directoryUri.LocalPath, true);
        }

        public IEnumerable<Uri> GetChildren(Uri directoryUri)
        {
            var localPath = Path.GetFullPath(directoryUri.LocalPath);
            return Directory.GetFileSystemEntries(localPath)
                .Select(entry => new Uri(Path.Combine(localPath, entry)));
        }
    }
}