using System.Text.Json;

namespace View_by_Distance.Shared.Models;

public class FileHolder : Properties.IFileHolder
{

    protected readonly DateTime? _CreationTime;
    protected readonly string? _DirectoryName;
    protected readonly bool _Exists;
    protected readonly string _ExtensionLowered;
    protected readonly string _FullName;
    protected readonly int? _Id;
    protected readonly DateTime? _LastWriteTime;
    protected readonly long? _Length;
    protected readonly string _Name;
    protected readonly string _NameWithoutExtension;
    public DateTime? CreationTime => _CreationTime;
    public string? DirectoryName => _DirectoryName;
    public bool Exists => _Exists;
    public string ExtensionLowered => _ExtensionLowered;
    public string FullName => _FullName;
    public int? Id => _Id;
    public DateTime? LastWriteTime => _LastWriteTime;
    public long? Length => _Length;
    public string Name => _Name;
    public string NameWithoutExtension => _NameWithoutExtension;

    public FileHolder(DateTime? creationTime, string? directoryName, bool exists, string extensionLowered, string fullName, int? id, DateTime? lastWriteTime, long? length, string name, string nameWithoutExtension)
    {
        _CreationTime = creationTime;
        _DirectoryName = directoryName;
        _Exists = exists;
        _ExtensionLowered = extensionLowered;
        _FullName = fullName;
        _Id = id;
        _LastWriteTime = lastWriteTime;
        _Length = length;
        _Name = name;
        _NameWithoutExtension = nameWithoutExtension;
    }

    public FileHolder(FileInfo fileInfo, int? id)
    {
        if (fileInfo.Exists)
        {
            _CreationTime = fileInfo.CreationTime;
            _CreationTime = fileInfo.CreationTime;
            _LastWriteTime = fileInfo.LastWriteTime;
            _Length = fileInfo.Length;
        }
        _DirectoryName = fileInfo.DirectoryName;
        _Exists = fileInfo.Exists;
        _ExtensionLowered = fileInfo.Extension.ToLower();
        _Id = id;
        _FullName = fileInfo.FullName;
        _Name = fileInfo.Name;
        _NameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
    }

    public FileHolder(string fileName) :
        this(new FileInfo(fileName), null)
    { }

    public FileHolder(string fileName, int? id) :
        this(new FileInfo(fileName), id)
    { }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        return result;
    }

}