using MiniJSON;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cut : MonoBehaviour
{
    private Item item;
    // Start is called before the first frame update
    public float MaxHealth = 1;
    public float RestorePerSecond = 0.1f;
    private float maxSize = 3;

    public GameObject Bad;
    public GameObject Good;

    void Awake()
    {
        item = GetComponentInChildren<Item>();
        item.OnRemoteUpdated = RemoteUpdated;
        maxSize = Bad.transform.localScale.y;
        health = MaxHealth;
    }

    private void RemoteUpdated()
    {
        float newHealth = 0;
        if (item == null) return;
        if (item.Details.ContainsKey("health"))
        {
            newHealth = item.Details.Key("health", Convert.ToSingle);
        }
        else
        {
            newHealth = MaxHealth;
        }

        float newMaxHealth = 0;
        if (item.Details.ContainsKey("max_health"))
        {
            newMaxHealth = item.Details.Key("max_health", Convert.ToSingle);
        }
        else
        {
            newMaxHealth = MaxHealth;
        }

        if (newHealth != health || newMaxHealth != MaxHealth)
        {
            health = newHealth;
            MaxHealth = newMaxHealth;
            UpdateHealthBar();
        }
    }

    private void UpdateHealthBar()
    {
        Vector3 s = Bad.transform.localScale;
        s.y = (health / MaxHealth) * maxSize;
        Bad.transform.localScale = s;

        Vector3 p = Bad.transform.localPosition;
        p.y = s.y * 0.5f;
        Bad.transform.localPosition = p;

        s = Good.transform.localScale;
        s.y = ((MaxHealth - health) / MaxHealth) * maxSize;
        Good.transform.localScale = s;

        p = Good.transform.localPosition;
        p.y = s.y * 0.5f + (health / MaxHealth) * maxSize;
        Good.transform.localPosition = p;
    }

    void StartLocal()
    {
        item.Details["health"] = health;
        item.Details["max_health"] = MaxHealth;
        item.SendUpdate();
    }

    private float health = 1;

    // Update is called once per frame
    void Update()
    {
        if (item != null && item.IsLocal)
        {
            health = Mathf.Min(MaxHealth, health + RestorePerSecond * Time.deltaTime);
            item.Details["health"] = health;
        }
    }
}
