using System.Collections;
using UnityEngine;

//////////////////////////////////////////////////////////////////
//【フルーツの生成と風の強さを変更するクラス】
// フルーツをシーン上に作成、風の向き・強さを変更
//////////////////////////////////////////////////////////////////
public class GameController : MonoBehaviour
{
    /////////////////////////////////
    // 【変数の設定】
    /////////////////////////////////

    //【定数の設定】
    const int CLEAR_COUNT = 50;  // ゲームクリアするフルーツの作成数
    const int MISS_COUNT = 3;  // ゲームオーバーするフルーツの落下数

    //【他のクラスからアクセスするPublic変数】
    public float windPower = 0.12f;  // フルーツに力をかける風の強さ       
    public bool isFinish = false;  // ゲーム終了フラグ
    public int missCount = 0;  // 地面に落下したフルーツの数

    //【Unity Editorから設定する変数】
    [SerializeField] GameObject[] fruitList;  // フルーツのPrefabリスト(配列)
    [SerializeField] GameObject windImage;  // 風画像のゲームオブジェクト
    [SerializeField] GameObject gameClear;  // ゲームクリアUI
    [SerializeField] GameObject gameOver;  // ゲームオーバーUI

    //【このプログラム内で使用するPrivate変数】
    int fruitCount = 0;  // シーン上に作成したフルーツの数


    /////////////////////////////////
    // 【関数の設定】
    /////////////////////////////////

    //【ゲーム開始時・ゲームオブジェクト生成時に１回だけ動く関数】
    //（Unityの標準関数）
    void Start()
    {
        // コルーチン関数CreateFruitを呼び出す 
        StartCoroutine(CreateFruit());

        // コルーチン関数ChangeWindを呼び出す
        StartCoroutine(ChangeWind());
    }


    //【フルーツをシーン上に作成するコルーチン】
    IEnumerator CreateFruit()
    {
        // isFinishがfalseで、fruitCountがゲームクリア数以上の場合
        if (!isFinish && fruitCount >= CLEAR_COUNT)
        {
            // isFinishフラグをtrueにする
            isFinish = true;
            // ゲームクリアUIを有効化する
            gameClear.SetActive(true);
        }

        // isFinishがfalseで、missCountがゲームオーバー数以上の場合
        else if (!isFinish && missCount >= MISS_COUNT)
        {
            // isFinishフラグをtrueにする
            isFinish = true;
            // ゲームオーバーUIを有効化する
            gameOver.SetActive(true);
        }

        // isFinishがtrueの場合、スクリプト内の全コルーチンを止める
        if (isFinish) StopAllCoroutines();

        // 3種類のフルーツのPrefabからランダムに１つシーン上に生成する
        GameObject fruit = Instantiate(fruitList[Random.Range(0, 3)]);

        // 生成したフルーツを木の上でX座標がランダムな位置に瞬間移動させる
        fruit.transform.position = new Vector3(Random.Range(-3f, 3f), 5.5f, 0);

        // シーン上に作成したフルーツ数をカウントアップする
        fruitCount++;
        // Consoleビューに作成したフルーツ数を表示する
        Debug.Log("Fruit:" + fruitCount);

        // 指定範囲内のランダム秒待つ
        yield return new WaitForSeconds(Random.Range(0.5f, 1.5f));

        // コルーチン関数CreateFruitを呼び出す
        StartCoroutine(CreateFruit());
    }


    //【風の向き・強さを変更するコルーチン】
    IEnumerator ChangeWind()
    {
        // 風の強さをランダムに設定
        windPower = Random.Range(-0.12f, 0.12f);

        // 風の強さが0.05より大きい場合
        if (windPower > 0.05)
        {
            // 風画像ゲームオブジェクトを有効化する
            windImage.SetActive(true);
            // 風画像の向きを右向きにする（元画像が右向き）
            windImage.transform.localScale = new Vector3(1, 1, 1);
        }
        // 風の強さが-0.05より小さい場合
        else if (windPower < -0.05)
        {
            // 風画像ゲームオブジェクトを有効化する
            windImage.SetActive(true);
            // 風画像の向きを左向きにする（元画像が右向き）
            windImage.transform.localScale = new Vector3(-1, 1, 1);
        }
        // 風の強さが-0.05以上、0.05以下の場合
        else
        {
            // 風を無風にする
            windPower = 0;
            // 風画像ゲームオブジェクトを無効化する
            windImage.SetActive(false);
        }

        // 指定範囲内のランダム秒待つ
        yield return new WaitForSeconds(Random.Range(1f, 2f));

        // コルーチン関数ChangeWindを呼び出す
        StartCoroutine(ChangeWind());
    }
}
