using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class SceneSizeObj : MonoBehaviour
{
    public Vector2 _OrgPos = Vector2.zero;
    public Vector2 _Size = new Vector2(100, 100);

    private readonly List<GameObject> _CubesX = new List<GameObject>();
    private readonly List<GameObject> _CubesY = new List<GameObject>();
    private Transform _CubeXBase;
    private Transform _CubeYBase;
    private Vector2 _Orgsize;
    private Camera _SceneCamera;

    private void Start()
    {
        transform.position = new Vector3(0, 500, 0);

        var cameraObj = new GameObject("SizeCamera");
        cameraObj.transform.SetParent(transform);
        cameraObj.transform.localRotation = Quaternion.Euler(90, 0, 0);
        cameraObj.transform.localPosition = new Vector3(0, 0, 0);
        _SceneCamera = cameraObj.AddComponent<Camera>();
        _SceneCamera.orthographic = true;
        _SceneCamera.clearFlags = CameraClearFlags.SolidColor;

        var cubeX = new GameObject("CubeX");
        cubeX.transform.SetParent(transform);
        _CubeXBase = cubeX.transform;

        var cubeY = new GameObject("CubeY");
        cubeY.transform.SetParent(transform);
        _CubeYBase = cubeY.transform;

        for (var i = 0; i < 1000; ++i)
        {
            var newBox = GameObject.CreatePrimitive(PrimitiveType.Cube);
            newBox.transform.SetParent(cubeX.transform);
            newBox.transform.localPosition = new Vector3(i, 200, 0);
            if (i < _Size.x)
                newBox.SetActive(true);
            else
                newBox.SetActive(false);
            _CubesX.Add(newBox);

            var newBox2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
            newBox2.transform.SetParent(cubeY.transform);
            newBox2.transform.localPosition = new Vector3(0, 200, i);
            if (i < _Size.y)
                newBox2.SetActive(true);
            else
                newBox2.SetActive(false);
            _CubesY.Add(newBox2);
        }
    }

    private void Update()
    {
        transform.position = new Vector3(_OrgPos.x + _Size.x * 0.5f, 500, _OrgPos.y + _Size.y * 0.5f);
        //_SceneCamera.transform.position = new Vector3(_OrgPos.x + 50, 1000, _OrgPos.y + 50);
        _SceneCamera.orthographicSize = Mathf.Max(_Size.x, _Size.y);

        _CubeXBase.transform.position = new Vector3(_OrgPos.x, -200, _OrgPos.y);
        _CubeYBase.transform.position = new Vector3(_OrgPos.x, -200, _OrgPos.y);

        UpdateSizeObj();
    }

    private void UpdateSizeObj()
    {
        if (_Orgsize == _Size)
            return;

        if (_Orgsize.x > _Size.x)
            for (var i = (int) _Orgsize.x; i > _Size.x; --i)
                _CubesX[i].SetActive(false);
        else
            for (var i = (int) _Orgsize.x; i < _Size.x; ++i)
                _CubesX[i].SetActive(true);

        if (_Orgsize.y > _Size.y)
            for (var i = (int) _Orgsize.y; i > _Size.y; --i)
                _CubesY[i].SetActive(false);
        else
            for (var i = (int) _Orgsize.y; i < _Size.y; ++i)
                _CubesY[i].SetActive(true);

        _Orgsize = _Size;
    }
}