using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System;
using GoogleMobileAds.Sample;

public class shopManager : MonoBehaviour
{
    public score scoreScript;
    public soundManager soundmanager;

    public bool[] owned;
    public bool[] show;
    public GameObject[] skins;
    public int[] cost;
    public Color[] buttonTextColor;

    public int selectedSkin;
    public int equippedSkin;

    public TMP_Text buttontext;
    public TMP_Text coinsText;
    public TMP_Text costText;
    public TMP_Text CoinText;

    public int coins;
    public bool coinsGiven;
    public int gamecoins;

    public Transform buyButton;
    public GameObject noBuyText;

    public string dateNow;

    public GameObject nextButton, prevButton;

    public Transform Canvas;
    public GameObject adsLeft;

    public GameObject RewardedAdButton;

    public int rewardedAdsLeft;

    [SerializeField] private RewardedAdController rewardedAdController;

    [SerializeField] private PlayGamesManager PGM;

    void Start()
    {
        dateNow = DateTime.Now.ToString("yyyyMMdd");
        //PlayerPrefs.DeleteAll();

        if (PlayerPrefs.GetString("lastDate") == "" || PlayerPrefs.GetString("lastDate") != DateTime.Now.ToString("yyyyMMdd"))
        {
            PlayerPrefs.SetInt("rewardedAdsLeft", 3);
            PlayerPrefs.SetString("lastDate", DateTime.Now.ToString("yyyyMMdd"));
        }

        PlayerPrefs.SetInt("skin1owned", 1);

        selectedSkin = PlayerPrefs.GetInt("equippedSkin");
        EquipSkin(PlayerPrefs.GetInt("equippedSkin"));
        ShowSkin(PlayerPrefs.GetInt("equippedSkin"));

        coinsText.text = coins.ToString();

        rewardedAdsLeft = PlayerPrefs.GetInt("rewardedAdsLeft");

        UpdateButton();
    }

    void Update()
    {
        if (GameObject.Find("player").GetComponent<PLayerLife>().life == false)
        {
            gamecoins = (int)scoreScript.scoreAmount;

            if (!coinsGiven)
            {
                coins += gamecoins;

                //  Save data
                PGM.OpenSave(true);

                coinsGiven = true;
            }

        }

       CoinText.text = gamecoins.ToString();
    }

    public void ShowSkin(int index)
    {
        for (int i = 0; i < skins.Length; i++)
        {
            if (i == index)
                skins[i].SetActive(true);
            else 
                skins[i].SetActive(false);
        }
    }

    public void EquipSkin(int index)
    {
        if (owned[selectedSkin])
        {
            equippedSkin = selectedSkin;
            PlayerPrefs.SetInt("equippedSkin", equippedSkin);
            ShowSkin(selectedSkin);

            soundmanager.PlayClick1();
        }
    }

    public void NextSkin()
    {
        if (selectedSkin < owned.Length - 1)
        {
            soundmanager.PlayClick1();
            selectedSkin++;
        }
        ShowSkin(selectedSkin);
        UpdateButton();
        
    }

    public void PrevSkin()
    {
        if (selectedSkin >0)
        {
            selectedSkin--;
            soundmanager.PlayClick1();
        }
        ShowSkin(selectedSkin);
        UpdateButton();
        
    }

    public void UpdateButton()
    {
        if (equippedSkin == selectedSkin)
        {
            costText.text = null;
            buttontext.color = buttonTextColor[0];
            buttontext.text = "equipped";
        }
        else if (owned[selectedSkin])
        {
            costText.text = null;
            buttontext.color = buttonTextColor[0];
            buttontext.text = "equip";
        }
        else if (!owned[selectedSkin] && coins >= cost[selectedSkin])
        {
            costText.text = cost[selectedSkin].ToString();
            buttontext.color = buttonTextColor[0];
            buttontext.text = "buy";
        }
        else if (!owned[selectedSkin] && coins < cost[selectedSkin])
        {
            costText.text = cost[selectedSkin].ToString();
            buttontext.color = buttonTextColor[1];
            buttontext.text = "buy";
        }

        if (selectedSkin == owned.Length - 1)
            nextButton.SetActive(false);
        else
            nextButton.SetActive(true);

        if(selectedSkin == 0)
            prevButton.SetActive(false);
        else 
            prevButton.SetActive(true);
    }

    public void UpdateUI()
    {
        UpdateButton();
        coinsText.text = coins.ToString();

    }

    public void Buy()
    {
        if (!owned[selectedSkin] && coins > cost[selectedSkin] )
        {
            owned[selectedSkin] = true;
            
            coins -= cost[selectedSkin];
            coinsText.text = coins.ToString();
            owned[selectedSkin+1] = true;
            soundmanager.PlayBuy();

            //  Save data
            PGM.OpenSave(true);
        }
        else if (owned[selectedSkin])
        {
            equippedSkin = selectedSkin;
            EquipSkin( equippedSkin );
        }
        else if( coins < cost[selectedSkin])
        {
            Transform noMonneyText = Instantiate(noBuyText, buyButton.position, buyButton.rotation).transform;
            noMonneyText.SetParent(buyButton);
            noMonneyText.transform.localPosition = Vector3.zero;
            soundmanager.PlayError();
        }

        UpdateUI();
    }

    public void ShowRewardedAd()
    {
        if (PlayerPrefs.GetInt("rewardedAdsLeft") > 0)
        {
            //  SHOW REWARDED AD
            rewardedAdController.ShowAd();
        }
        else
        {
            adsLeftText adsleft = Instantiate(adsLeft, Canvas.position, Canvas.rotation).GetComponent<adsLeftText>();
            adsleft.transform.SetParent(Canvas);
            soundmanager.PlayError();
            adsleft.txt = "COME BACK TOMORROW";
        }
    }

    public void ShowRewardedAdsLeft()
    {
        PlayerPrefs.SetInt("rewardedAdsLeft", PlayerPrefs.GetInt("rewardedAdsLeft") - 1);
        rewardedAdsLeft = PlayerPrefs.GetInt("rewardedAdsLeft");
        adsLeftText adsleft = Instantiate(adsLeft, Canvas.position, Canvas.rotation).GetComponent<adsLeftText>();
        adsleft.transform.SetParent(Canvas);

        adsleft.txt = (rewardedAdsLeft.ToString() + (rewardedAdsLeft == 1 ? " AD " : " ADs ") + "LEFT");
    }

    public void RewardUser()
    {
        coins += 100;
        coinsText.text = coins.ToString();
        ShowRewardedAdsLeft();

        //  Save data
        PGM.OpenSave(true);
    }

    public void EnableRewardedAdButton(bool enable)
    {
        RewardedAdButton.SetActive(enable);
    }

    public String GetOwnedPlanesString()
    {
        String ownedPlanes = owned[0]?"1":"0";

        for (int i = 1; i < owned.Length; i++) 
        {
            ownedPlanes += ";" + (owned[i] ? "1" : "0");
        }

        return ownedPlanes;
    }

    public void ConvertOwnedPlanes(String ownedPlanesString)
    {
        String[] ownedPlanes = ownedPlanesString.Split(';');

        

        for (int i = 0;i < ownedPlanes.Length; i++)
        {
            int planeOwned = int.Parse(ownedPlanes[i]);

            owned[i] = (planeOwned == 1 ? true:false);
        }
    }
}