using System;
using System.Linq;
using System.Text.RegularExpressions;

namespace TweetDuck.Core.Utils{
    static class StringUtils{
        public static readonly string[] EmptyArray = new string[0];

        public static string ExtractBefore(string str, char search, int startIndex = 0){
            int index = str.IndexOf(search, startIndex);
            return index == -1 ? str : str.Substring(0, index);
        }

        public static int[] ParseInts(string str, char separator){
            return str.Split(new char[]{ separator }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
        }
        
        public static string ConvertPascalCaseToScreamingSnakeCase(string str){
            return Regex.Replace(str, @"(\p{Ll})(\P{Ll})|(\P{Ll})(\P{Ll}\p{Ll})", "$1$3_$2$4").ToUpper();
        }

        public static string ConvertRot13(string str){
            return Regex.Replace(str, @"[a-zA-Z]", match => {
                int code = match.Value[0];
                int start = code <= 90 ? 65 : 97;
                return ((char)(start+(code-start+13)%26)).ToString();
            });
        }

        public static int CountOccurrences(string source, string substring){
            if (substring.Length == 0){
                throw new ArgumentOutOfRangeException(nameof(substring), "Searched substring must not be empty.");
            }

            int count = 0, index = 0, length = substring.Length;

            while((index = source.IndexOf(substring, index)) != -1){
                index += length;
                ++count;
            }

            return count;
        }
    }
}