// Copyright © 2016 Abcum Ltd
//
// Licensed 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.

package fake

import (
	"bytes"
	"fmt"
)

func String() string {
	return New().String()
}

func (f *Faker) String() string {
	var b bytes.Buffer
	for i := 0; i < f.IntegerBetween(1, 100); i++ {
		b.WriteString(f.Alphanum())
	}
	return b.String()
}

func StringLength(size int) string {
	return New().StringLength(size)
}

func (f *Faker) StringLength(size int) string {
	var b bytes.Buffer
	for i := 0; i < size; i++ {
		b.WriteString(f.Alphanum())
	}
	return b.String()
}

func StringBetween(beg, end int) string {
	return New().StringBetween(beg, end)
}

func (f *Faker) StringBetween(beg, end int) string {
	var b bytes.Buffer
	for i := 0; i < f.IntegerBetween(beg, end); i++ {
		b.WriteString(f.Alphanum())
	}
	return b.String()
}

func Syllable() string {
	return New().Syllable()
}

func (f *Faker) Syllable() string {
	if f.Bool() {
		switch f.Bool() {
		case true:
			return fmt.Sprintf("%s%s", f.CharVowel(), f.CharConsonant())
		case false:
			return fmt.Sprintf("%s%s", f.CharConsonant(), f.CharVowel())
		}
	}
	return fmt.Sprintf("%s%s%s", f.CharConsonant(), f.CharVowel(), f.CharConsonant())
}

func Word() string {
	return New().Word()
}

func (f *Faker) Word() string {
	var str [4]string
	for i := 0; i < 4; i++ {
		str[i] = ""
	}
	for i := 0; i < f.IntegerBetween(2, 4); i++ {
		str[i] = f.Syllable()
	}
	return fmt.Sprintf("%s%s%s%s", str[0], str[1], str[2], str[3])
}