// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OpenXmlPowerTools
{
    public class ListItemTextGetter_fr_FR
    {
        private static string[] OneThroughNineteen = {
            "", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit",
            "neuf", "dix", "onze", "douze", "treize", "quatorze",
            "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf"
        };

        private static string[] Tens = {
            "", "dix", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante-dix",
            "quatre-vingt", "quatre-vingt-dix"
        };

        private static string[] OrdinalOneThroughNineteen = {
            "", "unième", "deuxième", "troisième", "quatrième", "cinquième", "sixième",
            "septième", "huitième", "neuvième", "dixième", "onzième", "douzième",
            "treizième", "quatorzième", "quinzième", "seizième",
            "dix-septième", "dix-huitième", "dix-neuvième"
        };

        private static string[] OrdinalTenths = {
            "", "dixième", "vingtième", "trentième", "quarantième", "cinquantième",
            "soixantième", "soixante-dixième", "quatre-vingtième", "quatre-vingt-dixième"
        };

        private static string[] OrdinalTenthsPlus = {
            "", "", "vingt", "trente", "quarante", "cinquante",
            "soixante", "", "quatre-vingt", ""
        };

        public static string GetListItemText(string languageCultureName, int levelNumber, string numFmt)
        {
            if (numFmt == "cardinalText")
            {
                string result = "";

                var sLevel = (levelNumber + 10000).ToString();
                int thousands = int.Parse(sLevel.Substring(1, 1));
                int hundreds = int.Parse(sLevel.Substring(2, 1));
                int tens = int.Parse(sLevel.Substring(3, 1));
                int ones = int.Parse(sLevel.Substring(4, 1));

                /* exact thousands */
                if (levelNumber == 1000)
                    return "Mille";
                if (levelNumber > 1000 && hundreds == 0 && tens == 0 && ones == 0)
                {
                    result = OneThroughNineteen[thousands] + " mille";
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                /* > 1000 */
                if (levelNumber > 1000 && levelNumber < 2000)
                    result = "mille ";
                else if (levelNumber > 2000 && levelNumber < 10000)
                    result = OneThroughNineteen[thousands] + " mille ";

                /* exact hundreds */
                if (hundreds > 0 && tens == 0 && ones == 0)
                {
                    if (hundreds == 1)
                        result += "cent";
                    else
                        result += OneThroughNineteen[hundreds] + " cents";
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                /* > 100 */
                if (hundreds > 0)
                {
                    if (hundreds == 1)
                        result += "cent ";
                    else
                        result += OneThroughNineteen[hundreds] + " cent ";
                }

                /* exact tens */
                if (tens > 0 && ones == 0)
                {
                    if (tens == 8)
                        result += "quatre-vingts";
                    else
                        result += Tens[tens];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                /* 71-79 */
                if (tens == 7)
                {
                    if (ones == 1)
                        result += Tens[6] + " et " + OneThroughNineteen[ones + 10];
                    else
                        result += Tens[6] + "-" + OneThroughNineteen[ones + 10];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                /* 91-99 */
                if (tens == 9)
                {
                    result += Tens[8] + "-" + OneThroughNineteen[ones + 10];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                if (tens >= 2)
                {
                    if (ones == 1 && tens != 8 && tens != 9)
                        result += Tens[tens] + " et un";
                    else
                        result += Tens[tens] + "-" + OneThroughNineteen[ones];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                if (levelNumber < 20)
                {
                    result += OneThroughNineteen[tens * 10 + ones];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                result += OneThroughNineteen[tens * 10 + ones];
                return result.Substring(0, 1).ToUpper() + result.Substring(1);
            }
            if (numFmt == "ordinal")
            {
                string suffix;
                if (levelNumber == 1)
                    suffix = "er";
                else
                    suffix = "e";
                return levelNumber.ToString() + suffix;
            }
            if (numFmt == "ordinalText")
            {
                string result = "";

                if (levelNumber == 1)
                    return "Premier";

                var sLevel = (levelNumber + 10000).ToString();
                int thousands = int.Parse(sLevel.Substring(1, 1));
                int hundreds = int.Parse(sLevel.Substring(2, 1));
                int tens = int.Parse(sLevel.Substring(3, 1));
                int ones = int.Parse(sLevel.Substring(4, 1));

                /* exact thousands */
                if (levelNumber == 1000)
                    return "Millième";
                if (levelNumber > 1000 && hundreds == 0 && tens == 0 && ones == 0)
                {
                    result = OneThroughNineteen[thousands] + " millième";
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                /* > 1000 */
                if (levelNumber > 1000 && levelNumber < 2000)
                    result = "mille ";
                else if (levelNumber > 2000 && levelNumber < 10000)
                    result = OneThroughNineteen[thousands] + " mille ";

                /* exact hundreds */
                if (hundreds > 0 && tens == 0 && ones == 0)
                {
                    if (hundreds == 1)
                        result += "centième";
                    else
                        result += OneThroughNineteen[hundreds] + " centième";
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                /* > 100 */
                if (hundreds > 0)
                {
                    if (hundreds == 1)
                        result += "cent ";
                    else
                        result += OneThroughNineteen[hundreds] + " cent ";
                }

                /* exact tens */
                if (tens > 0 && ones == 0)
                {
                    result += OrdinalTenths[tens];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                /* 71-79 */
                if (tens == 7)
                {
                    if (ones == 1)
                        result += OrdinalTenthsPlus[6] + " et " + OrdinalOneThroughNineteen[ones + 10];
                    else
                        result += OrdinalTenthsPlus[6] + "-" + OrdinalOneThroughNineteen[ones + 10];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                /* 91-99 */
                if (tens == 9)
                {
                    result += OrdinalTenthsPlus[8] + "-" + OrdinalOneThroughNineteen[ones + 10];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                if (tens >= 2)
                {
                    if (ones == 1 && tens != 8 && tens != 9)
                        result += OrdinalTenthsPlus[tens] + " et unième";
                    else
                        result += OrdinalTenthsPlus[tens] + "-" + OrdinalOneThroughNineteen[ones];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                if (levelNumber < 20)
                {
                    result += OrdinalOneThroughNineteen[tens * 10 + ones];
                    return result.Substring(0, 1).ToUpper() + result.Substring(1);
                }

                result += OrdinalOneThroughNineteen[tens * 10 + ones];
                return result.Substring(0, 1).ToUpper() + result.Substring(1);
            }
            return null;
        }
    }
}
