using UnityEngine;
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Globalization;

namespace mgaia.Utils
{
    /// <summary>
    /// Extensões para manipulação de strings
    /// </summary>
    public static class StringExtensions
    {
        /// <summary>
        /// Concatena o nome de um arquivo com uma extensão
        /// </summary>
        /// <owner>Victor</owner>
        public static string WithExtension(this string @string, string extension)
        {
            if (extension.Contains(Constants.DOT))
            {
                return @string + extension;
            }
            else
            {
                return String.Format(Constants.FILE_NAME_WITH_EXTENSION_FORMAT, @string, extension);
            }
        }

        /// <summary>
        /// Remove a extensão do nome do arquivo
        /// </summary>
        /// <owner>Victor</owner>
        public static string RemoveExtension(this string @string)
        {
            int dotIndex = @string.LastIndexOf('.');
            return @string.Substring(0, dotIndex);
        }

        /// <summary>
        /// Converte um caminho de asset para o caminho utilizado para carregar Resources
        /// </summary>
        /// <owner>Victor</owner>
        public static string ToResourcesFilePath(this string @string)
        {
            return @string.Replace(Constants.ASSET_DIRECTORY_SEPARATOR, Constants.RESOURCE_DIRECTORY_SEPARATOR);
        }

        /// <summary>
        /// Converte um caminho de Resources para o caminho utilizado para carregar assets
        /// </summary>
        /// <owner>Victor</owner>
        public static string ToAssetFilePath(this string @string)
        {
            return @string.Replace(Constants.RESOURCE_DIRECTORY_SEPARATOR, Constants.ASSET_DIRECTORY_SEPARATOR);
        }

        /// <summary>
        /// Transforma a string no formato primeiras letras maiusculas
        /// </summary>
        /// <owner>Victor</owner>
        public static string FirstLetterCapital(this string @string)
        {
            string lowerCase = @string.ToLowerInvariant();
            char firstLetterCapital = Char.ToUpperInvariant(@string[0]);

            string word = firstLetterCapital.ToString();

            if (lowerCase.Length > 1)
            {
                word += lowerCase.Substring(1);
            }

            return word;
        }

        /// <summary>
        /// Retorna a quantidade de linhas que uma string possui
        /// </summary>
        /// <owner>Victor</owner>
        public static int GetNumberOfLines(this string @string)
        {
            return GetLines(@string, StringSplitOptions.RemoveEmptyEntries).Length;
        }

        /// <summary>
        /// Retorna todas as linhas de uma string
        /// </summary>
        /// <owner>Victor</owner>
        public static string[] GetLines(this string @string, StringSplitOptions options)
        {
            return @string.Split(new char[] { Constants.NewLine }, options);
        }

		/// <summary>
		/// Concatena várias string adicionando quebra de linha
		/// </summary>
		public static string ConcatenateWithLineBreaks(params string[] values)
		{
			StringBuilder stringBuilder = new StringBuilder();

			for (int i = 0; i < values.Length; i++)
			{
				string value = values[i];

				stringBuilder.Append(value);

				if (i < values.Length - 1)
				{
					stringBuilder.Append(Constants.NewLine);
				}
			}

			return stringBuilder.ToString();
		}
    }
}