﻿using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using TMPro;

[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class ClockController : UdonSharpBehaviour {
	public bool shaderBased = true;
	public Material hoursMat,minutesMat,secondsMat,daysMat,periodMat;
	public TextMeshPro tmp;
	public double dayProgress = 0;
	public int dayCount = 12;
	public int currDay = 0;

	const int periodsPerDay = 6;
	const int hoursPerPeriod = 36;
	const int minutesPerHour = 36;
	const int secondsPerMinute = 36;
	const int secondsPerDay = periodsPerDay * hoursPerPeriod * minutesPerHour * secondsPerMinute;

	private float timer = 0;

	void Update() {
		timer += Time.deltaTime;
		if(timer > 0.333) {
			timer = 0;
			int timeInDay = (int)((dayProgress % 1.0) * secondsPerDay);

			int div = hoursPerPeriod * minutesPerHour * secondsPerMinute;
			int period = timeInDay / div;
			timeInDay -= period * div;
			div = minutesPerHour * secondsPerMinute;
			int hour = timeInDay / div;
			timeInDay -= hour * div;
			div = secondsPerMinute;
			int minute = timeInDay / div;
			timeInDay -= minute * div;
			int second = timeInDay;

			if(shaderBased) {
				secondsMat.SetInt("_Number", second);
				minutesMat.SetInt("_Number", minute);
				hoursMat.SetInt("_Number", hour);
				periodMat.SetInt("_Number", period * 10);
				daysMat.SetInt("_Number", (currDay % dayCount) + 1);
			}
			if(tmp) tmp.text = $"{period.ToString("D1")}P   {hour.ToString("D2")}:{minute.ToString("D2")}:{second.ToString("D2")}";
		}
	}
}
