using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Controller : MonoBehaviour
{
    public float time, immunity, coin, coinGain;
    public float virusImpact, medImpact;
    // ссылки на хотбар и магазин
    public GameObject hotbar, research;
    
    // ссылки на отображение описания
    public Text textDescription;
    public Image imageDescription;
    // ссылки на отображения информационных текстов
    public Text textTimer, textImmunity, textCoin, textMessage;
    public Image imageMessage;

    public Sprite spriteOn, spriteScan, spriteOff;

    public WinnerTimer winnerTimer;

    public SpriteRenderer peopleSpr;

    public DrawAbilityDescription drawDescription;

    public Text scanCivic, scanCovid;


    // НАЗВАНИЕ способности
    public Dictionary<string,string> nameOfAbilities = new Dictionary<string,string>
    {
        {"Ability01","Вирус 1-го порядка"}, 
        {"Ability02","Вирус 2-го порядка"}, 
        {"Ability03","Вирус 3-го порядка"}, 
        {"Ability04","Вирус 4-го порядка"}, 
        {"Ability05","Вирус 5-го порядка"}, 
        {"Ability06","Вирус 6-го порядка"},
        {"Scan","Сканирование"}, 
        {"Development","Развитие"}
    };

    // ОПИСАНИЕ способности
    public Dictionary<string,string> descriptionOfAbilities = new Dictionary<string,string>
    {
        {"Ability01", "Посылает вирус слабого воздействия (минус <color=#75FF33>{0} %</color> иммунитета)"}, 
        {"Ability02", "Посылает <color=#FFAC00>вирус 1-порядка</color> уменьшающий иммунитет на <color=#75FF33>{1}% в течении {0} сек.</color>"}, 
        {"Ability03", "Посылает вирус понижающий воздействие медикаментов (уменьшение на <color=#75FF33>{0} %</color> воздействия)"}, 
        {"Ability04", "Посылает вирус отключающий негативные эффекты медикаментов"}, 
        {"Ability05", "Посылает вирус отключающий воздействие медикаментов (длительность <color=#75FF33>{0} сек.</color>)"}, 
        {"Ability06", "Посылает вирус инвертирующий иммунитет людей"},
        {"Scan", "Провести сканирование текущей прокачки оппонента"}, 
        {"Development", "Улучшение текущих способностей"}
    };


    
    // значения ВОЗДЕЙСТВИЙ
    public Dictionary<string,float> impactAbility = new Dictionary<string,float>
    {
        {"Ability01",0.1f},// -0,1 иммунитета
        {"Ability02",1f},  // 1 сек 
        {"Ability03",10f}, // 10 % уменьшения
        {"Ability04",0f},  // пустышка
        {"Ability05",3f},  // 3 сек. действия
        {"Ability06",0f},  // пустышка
        {"Scan",0f},       // пустышка
        {"Development",0f},// пустышка
        {"Income",1f},     // 1 коин в сек
        {"Cancel",0f}      // пустышка
    };

    public Dictionary<string,string> nameOfUpAbilities = new Dictionary<string,string>
    {
        {"Cancel","Закрыть"},
        {"Ability01","Улучшение вируса 1-го порядка"}, 
        {"Ability02","Улучшение вируса 2-го порядка"}, 
        {"Ability03","Улучшение вируса 3-го порядка"}, 
        {"Ability04","Улучшение вируса 4-го порядка"}, 
        {"Ability05","Улучшение вируса 5-го порядка"}, 
        {"Ability06","Улучшение вируса 6-го порядка"},
        {"Scan","Открытие сканирования"}, 
        {"Income","Улучшение экономического положения"}
    };

    public Dictionary<string,string> descriptionOfUpAbilities = new Dictionary<string,string>
    {
        {"Ability01","Повышает воздействие вируса до <color=#75FF33>{0} %</color>"}, 
        {"Ability02","Повышает время действия вируса до <color=#75FF33>{0}  сек.</color> "}, 
        {"Ability03","Повышает эффективность понижения воздействия медикаментов до <color=#75FF33>{0} %</color>"}, 
        {"Ability04","Позволяет использовать вирус <color=#FFAC00>отключающий негативные эффекты</color> медикаментов"}, 
        {"Ability05","Повышает время воздействия негативного эффекта вируса до <color=#75FF33>{0} сек.</color>"}, 
        {"Ability06","Позволяет использовать вирус меняющий ход игры"},
        {"Scan","Позволяет использовать <color=#FFAC00>СКАНИРОВАНИЕ</color>"}, 
        {"Income","Повышает приток игдкоинов до <color=#FFAC00>{0} в сек.</color>"},
        {"Cancel","***вернуться обратно***"}  
    };

    // СТОИМОСТЬ способности
    public Dictionary<string,float> costAbilities = new Dictionary<string,float>
    {
        {"Ability01",5}, 
        {"Ability02",15}, 
        {"Ability03",22}, 
        {"Ability04",29}, 
        {"Ability05",44}, 
        {"Ability06",1800},
        {"Scan",28}, 
        {"Development",0},
        {"Income",0}
    };
    
    public Dictionary<string,float> costUpAbility = new Dictionary<string,float>
    {
        {"Ability01",7}, 
        {"Ability02",21}, 
        {"Ability03",30}, 
        {"Ability04",40}, 
        {"Ability05",60}, 
        {"Ability06",2000},
        {"Scan",28}, 
        {"Income",10},
        {"Cancel",0}
    };

    public Dictionary<string,float> qImpact = new Dictionary<string,float>
    {
        {"Ability01",1.5f}, 
        {"Ability02",1.3f}, 
        {"Ability03",1.25f}, 
        {"Ability04",1}, 
        {"Ability05",1.5f}, 
        {"Ability06",1.5f},
        {"Scan",1f}, 
        {"Income",1.7f},
        {"Cancel",0}
    };

    public Dictionary<string,float> qCost = new Dictionary<string,float>
    {
        {"Ability01",1.5f}, 
        {"Ability02",1.5f}, 
        {"Ability03",1.5f}, 
        {"Ability04",1.5f}, 
        {"Ability05",1.5f}, 
        {"Ability06",1.8f},
        {"Scan",1.6f}, 
        {"Income",1f},
        {"Cancel",0}
    };

    public Dictionary<string,float> qCostUp = new Dictionary<string,float>
    {
        {"Ability01",1.5f}, 
        {"Ability02",1.5f}, 
        {"Ability03",1.5f}, 
        {"Ability04",1.5f}, 
        {"Ability05",1.5f}, 
        {"Ability06",1.8f},
        {"Scan",1.6f}, 
        {"Income",1.8f},
        {"Cancel",0}
    };

    public Dictionary<string,string> abilityStatus = new Dictionary<string,string>
    {
        {"Ability01","open"},

        {"Ability02","close"}, 
        {"Ability03","close"},

        {"Ability04","close"},
        {"UpAbility04","open"},

        {"Ability05","close"},
        {"UpAbility05","open"},

        {"Ability06","close"},
        {"UpAbility06","open"},

        {"Scan","close"},
        {"UpScan","open"},

        {"Income","open"},
        {"Development","open"},
        {"Cancel","open"}
    };

    public Dictionary<string,string> descriptionCloseAbility = new Dictionary<string,string>
    {
        {"Ability02", "<color=#75FF33>Вирус 2-го порядка</color>\n<color=#FF0000>Для использования изучите его</color>"}, 
        {"Ability03", "<color=#75FF33>Вирус 3-го порядка</color>\n<color=#FF0000>Для использования изучите его</color>"},  
        {"Ability04", "<color=#75FF33>Вирус 4-го порядка</color>\n<color=#FF0000>Для использования изучите его</color>"}, 
        {"Ability05", "<color=#75FF33>Вирус 5-го порядка</color>\n<color=#FF0000>Для использования изучите его</color>"}, 
        {"Ability06", "<color=#75FF33>Вирус 6-го порядка</color>\n<color=#FF0000>Для использования изучите его</color>"}, 
        {"Scan", "<color=#75FF33>Cканирование</color>\n<color=#FF0000>Для использования изучите его</color>"}, 
    };

    public Dictionary<string,string> descriptionCloseUpAbility = new Dictionary<string,string>
    {
        {"Ability02", "<color=#75FF33>Открытие вируса 2-го порядка</color>\nПозволяет посылать вирус 1-го порядка уменьшающий иммунитет на <color=#75FF33>{1}% в течении {0} сек.</color>"}, 
        {"Ability03", "<color=#75FF33>Открытие вируса 3-го порядка</color>\nПозволяет посылать вирус понижающий воздействие медикаментов\n(уменьшение на <color=#75FF33>{0} %</color> воздействия)"}, 
        {"Ability04", "<color=#75FF33>Открытие вируса 4-го порядка</color>\nПозволяет посылать вирус <color=#FFAC00>отключающий негативные эффекты</color> медикаментов"}, 
        {"Ability05", "<color=#75FF33>Открытие вируса 5-го порядка</color>\nПозволяет посылать вирус отключающий воздействие\nмедикаментов (длительность <color=#75FF33>{0} сек.</color>)"}, 
        {"Ability06", "<color=#75FF33>Открытие вируса 6-го порядка</color>\nПозволяет посылать вирус инвертирующий иммунитет людей"},
        {"Scan", "<color=#75FF33>Открытие сканирования</color>\nПозволяет провести сканирование текущей прокачки оппонента"}, 
    };

    public Dictionary<string,float> aiCostAbility = new Dictionary<string,float>
    {
        {"Ability01",5}, 
        {"Ability02",15}, 
        {"Ability03",22}, 
        {"Ability04",29}, 
        {"Ability05",44}, 
        {"Ability06",1800},
        {"Scan",28},
        {"Income",0}
    };

    public Dictionary<string,float> aiCostUpAbility = new Dictionary<string,float>
    {
        {"Ability01",7}, 
        {"Ability02",21}, 
        {"Ability03",30}, 
        {"Ability04",40}, 
        {"Ability05",60}, 
        {"Ability06",2000},
        {"Scan",28}, 
        {"Income",10},
        {"Cancel",0}
    };

    
    // значения ВОЗДЕЙСТВИЙ
    public Dictionary<string,float> aiImpactAbility = new Dictionary<string,float>
    {
        {"Ability01",0.1f},// -0,1 иммунитета
        {"Ability02",1f},  // 1 сек действия
        {"Ability03",10f}, // 10 % уменьшения
        {"Ability04",0f},  // пустышка
        {"Ability05",3f},  // 3 сек. действия
        {"Ability06",0f},  // пустышка
        {"Income",1f}
    };

    public Dictionary<string,bool> aiStatusAbility = new Dictionary<string,bool>
    {
        {"Ability01",true},
        {"Ability02",false}, 
        {"Ability03",false}, 
        {"Ability04",false}, 
        {"Ability05",false},  
        {"Ability06",false},
        {"Scan",false},
        {"Income",true}
    };

    public Dictionary<string,bool> aiStatusUpAbility = new Dictionary<string,bool>
    {
        {"Ability01",true},
        {"Ability02",true},
        {"Ability03",true},
        {"Ability04",true}, 
        {"Ability05",true},
        {"Ability06",true},
        {"Scan",true},
        {"Income",true}
    };


    // ссылка на текстбокс
    public Dictionary<string,Text> refTextBox = new Dictionary<string,Text>{};

    public List<GameObject> virus02Objects = new List<GameObject>{};
    public List<GameObject> pill02Objects = new List<GameObject>{};
    
    void Awake() 
    {
        ChangeImmunity(0);
        textCoin.text = coin.ToString();
        coinGain = impactAbility["Income"];
        
        DrawMessage("");
        hotbar.SetActive(true);
        research.SetActive(false);

        drawDescription = research.GetComponent<DrawAbilityDescription>();
        refTextBox.Add("Ability01", drawDescription.textCost01);
        refTextBox.Add("Ability02", drawDescription.textCost02);
        refTextBox.Add("Ability03", drawDescription.textCost03);
        refTextBox.Add("Ability04", drawDescription.textCost04);
        refTextBox.Add("Ability05", drawDescription.textCost05);
        refTextBox.Add("Ability06", drawDescription.textCost06);
        refTextBox.Add("Scan", drawDescription.textCost07);
        refTextBox.Add("Income", drawDescription.textCost08);

    }
    // Update is called once per frame

    public void ChangeImmunity(float immunityChange)
    {
        immunity += immunityChange;

        if (immunity <= 0)
        {immunity = 0;}

        if (immunity >= 100)
        {immunity = 100;}

        textImmunity.text = "Иммунитет: " + float.Parse(immunity.ToString("f2")) + " %";
    }

    public void ChangeCoin(float _coin)
    {
        coin += _coin;
        textCoin.text = ((int)coin).ToString();
    }

    public void ChangeValues(Dictionary<string,float> dic, string keyDic, float value, Text text = null, bool intengering = false)
    {
        if (intengering) {dic[keyDic] = (int)Mathf.Round(value);}
        else {dic[keyDic] = float.Parse(value.ToString("f2"));}
        
        if (text != null)
        {text.text = dic[keyDic].ToString();}
        
    }

    public float ChangeValues(float value, bool intengering = false)
    {
        if (intengering) {value = (int)Mathf.Round(value);}
        else {value = float.Parse(value.ToString("f2"));}
        
        return value;
    }

    public float Progression(float value, float q = 1f)
    {
        return value * q;
    }

    public void DrawMessage(string msg)
    {
        if (msg == "")
        {
            textMessage.enabled = false;
            imageMessage.enabled = false;
        }
        else
        {
            textMessage.color = new Color (1f, 1f, 1f,1f);
            imageMessage.color = new Color (0.726f, 0.209f, 0.209f,0.75f);
            textMessage.enabled = true;
            imageMessage.enabled = true;
            textMessage.text = msg;
            imageMessage.GetComponent<AlphaMessage>().alpha = 100f;
            imageMessage.GetComponent<AlphaMessage>().textMessageAlpha = 1f;
            imageMessage.GetComponent<AlphaMessage>().imageMessageAlpha = 0.75f;
        }
    }

    void Update()
    {
        time += Time.deltaTime;
        ChangeCoin(coinGain * Time.deltaTime);

        if (immunity <= 0 && winnerTimer.status == false)
        {
            winnerTimer.status = true;
            winnerTimer.gameObject.SetActive(true);
            winnerTimer.winner = "covid";
        }

        if (immunity >= 100 && winnerTimer.status == false)
        {
            winnerTimer.status = true;
            winnerTimer.gameObject.SetActive(true);
            winnerTimer.winner = "civic";
        }

        peopleSpr.color = Color.HSVToRGB(immunity / 300 , 0.5f, 1f);
    }

    void OnGUI() 
    {
        // отображение игрового времени
        textTimer.text = ((int)time / 60).ToString("d2") + ":" + ((int)time % 60).ToString("d2");

        scanCivic.text = "1. " + aiImpactAbility["Ability01"]+"\n2. "+ aiImpactAbility["Ability02"] +"\n3. "+ aiImpactAbility["Ability03"] +"\n4. "+ aiStatusAbility ["Ability04"]
        +"\n5. "+ aiImpactAbility["Ability05"]  +"\n6. "+ aiStatusAbility["Ability06"];

        scanCovid.text = "1. " + impactAbility["Ability01"]+"\n2. "+ impactAbility["Ability02"] +"\n3. "+ impactAbility["Ability03"] +"\n4. "+ abilityStatus ["Ability04"]
        +"\n5. "+ impactAbility["Ability05"]  +"\n6. "+ abilityStatus["Ability06"];
    }

    public void SetActiveButton(GameObject button, GameObject info, bool active)
    {
        if (active == false)
        {button.GetComponent<Image>().sprite = spriteOff;}
        else
        {
            if (button.name == "Scan")
            {button.GetComponent<Image>().sprite = spriteScan;}
            else
            {button.GetComponent<Image>().sprite = spriteOn;}
        }
        info.SetActive(active);
    }
}
