using System.Collections;
using UnityEngine;

//////////////////////////////////////////////////////////////////
//【敵の生成とゲームオーバー・ゲームクリアに使用するクラス】
// 敵(ゾンビ、ゴースト)をランダムに生成、ゲームオーバー・ゲームクリア処理
//////////////////////////////////////////////////////////////////
public class GameController : MonoBehaviour
{
    /////////////////////////////////
    // 【変数の設定】
    /////////////////////////////////

    //【定数の設定】
    const int CLEAR_COUNT = 40;  // ゲームクリアする敵の作成数

    //【他のクラスからアクセスするPublic変数】
    public int gameStatus = 0;  // ゲームステイタス
    // (0:ゲーム中、1:ゲームオーバー、2:ゲームクリア)

    //【Unity Editorから設定する変数】
    [SerializeField] GameObject[] pre_Enemy_L;  // 左向きの敵Prefab(配列)
    [SerializeField] GameObject[] pre_Enemy_R;  // 右向きの敵Prefab(配列)

    [SerializeField] GameObject gameOver;  // ゲームオーバーUI
    [SerializeField] GameObject gameClear;  // ゲームクリアUI

    //【このプログラム内で使用するPrivate変数】
    int enemyCount = 0;  // 生成した敵の数


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

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


    //【敵(ゾンビ、ゴースト)をシーン上に作成するコルーチン】
    IEnumerator CreateEnemy()
    {
        // 生成した敵の数がゲームクリア数に達した場合
        if (enemyCount == CLEAR_COUNT)
        {
            // ゲームクリア関数を呼び出す
            GameClear();
        }

        int direction;  // 敵を生成する位置(1:画面右端、-1:画面左端)
        GameObject[] pre_Enemy;  // 敵のPrefabを一時的に入れる変数(配列)

        // 0～1のランダム値が0.5より大きい場合
        if (Random.value > 0.5)
        {
            direction = 1;  // 敵を生成する位置(1:画面右端)
            pre_Enemy = pre_Enemy_L;  // 左向きの敵Prefabを取得
        }
        // 0～1のランダム値が0.5以下の場合
        else
        {
            direction = -1;  // 敵を生成する位置(-1:画面左端)
            pre_Enemy = pre_Enemy_R;  // 右向きの敵Prefabを取得
        }

        // ランダムに敵(ゾンビ、ゴースト)を、Y座標がランダムな位置に生成
        Instantiate(pre_Enemy[Random.Range(0, 2)],
            new Vector3(direction * 10, Random.Range(-3, 4), 0), Quaternion.identity);

        // 生成した敵の数をカウントアップ
        enemyCount++;
        // Consoleビューに作成した敵の数を表示する
        Debug.Log("Enemy Count: " + enemyCount);

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

        // gameStatus=0の場合、コルーチン関数CreateEnemyを呼び出す
        if (gameStatus == 0) StartCoroutine(CreateEnemy());
    }


    //【ゲームオーバー処理関数】
    public void GameOver()
    {
        // ゲームステイタスを1(ゲームオーバー)にする
        gameStatus = 1;
        // ゲームオーバーUIを有効化する
        gameOver.SetActive(true);
    }


    //【ゲームクリア処理関数】
    void GameClear()
    {
        // スクリプト内の全コルーチンを止める
        StopAllCoroutines();
        // ゲームステイタスを2(ゲームクリア)にする
        gameStatus = 2;
        // ゲームクリアUIを有効化する
        gameClear.SetActive(true);
    }
}
