package com.vgmlr.wedge
import android.content.Context
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import java.io.File
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DataView(vm: MainViewModel, prefs: PreferenceManager, onBack: () -> Unit) {
val context = LocalContext.current
val editorBg by prefs.bgColor.collectAsState(WedgeConfig.BG_COLOR_DEFAULT)
val noteEntity by vm.dao.getNote().collectAsState(initial = null)
val content = noteEntity?.content ?: ""
val charCount = content.length
val lineCount = if (content.isEmpty()) 0 else content.count { it == '\n' } + 1
val timestamp = noteEntity?.lastModified ?: System.currentTimeMillis()
val modifiedStr = WedgeDate.getOtcMetadata(timestamp)
val backupStr = remember {
val backupFile = File(context.getExternalFilesDir(null), "backups/wedge.bk")
if (backupFile.exists()) WedgeDate.getOtcMetadata(backupFile.lastModified()) else "[none]"
}
val syncStr = remember {
val prefsShared = context.getSharedPreferences("sync_prefs", Context.MODE_PRIVATE)
val syncTimestamp = prefsShared.getLong("sync_last_stamp", 0L)
if (syncTimestamp == 0L) "[none]" else WedgeDate.getOtcMetadata(syncTimestamp)
}
Scaffold(
topBar = {
TopAppBar(
title = { Text("Data", color = colorResource(id = R.color.title_color), fontSize = 18.sp) },
colors = TopAppBarDefaults.topAppBarColors(containerColor = Color(0xFF486860)),
navigationIcon = {
IconButton(onClick = onBack) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, null, tint = colorResource(id = R.color.title_color))
}
}
)
}
) { paddingValues ->
Column(
modifier = Modifier
.padding(paddingValues)
.fillMaxSize()
.background(parseColor(editorBg))
.verticalScroll(rememberScrollState())
.padding(top = 16.dp, start = 16.dp, end = 16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
SectionSurface(title = "Data") {
DataRowSection(
labels = listOf("Lines", "Characters", "Modified", "Archived", "Synced"),
values = listOf("$lineCount", "$charCount", modifiedStr, backupStr, syncStr)
)
}
SectionSurface(title = "Syntax") {
DataRowSection(
labels = listOf(
"Math", " ", "Days", " ", " ",
"Focus", "Italic", "Under-Line",
"Strike-Thru", "HR", "Dash"
),
values = listOf(
"123+456=", "operators: + - / * %", "20mar()=",
"(otc-date)", "auto-updates", "text!", "text?",
"text*", "text~", "hr([#])", "dash([#])"
)
)
}
SectionSurface(title = "Logic") {
DataRowSection(
labels = listOf("List", "Sort", " ", "Indent"),
values = listOf("1. text[enter]", "[select][sort]", "parent|child", "[true]")
)
}
SectionSurface(title = "Notch") {
DataRowSection(
labels = listOf("Date Header", " ", "Alarm Regex", " "),
values = listOf("1 fri 20 mar", "10:00 text", "10:00 text()", "(hours-left)")
)
}
SectionSurface(title = "Security") {
DataRowSection(
labels = listOf("Encryption"),
values = listOf("AES-256 [wdg:]")
)
}
Spacer(modifier = Modifier.height(16.dp))
}
}
}
@Composable
private fun SectionSurface(title: String, content: @Composable () -> Unit) {
Column(modifier = Modifier.fillMaxWidth()) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 15.dp)
.background(colorResource(id = R.color.calc_bg_color)),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center
) {
Text(
text = title,
modifier = Modifier.padding(vertical = 7.dp),
color = colorResource(id = R.color.data_color),
style = MaterialTheme.typography.bodyMedium.copy(
letterSpacing = 1.5.sp
)
)
}
Surface(
modifier = Modifier.fillMaxWidth(),
color = Color.Transparent,
content = content
)
}
}
@Composable
private fun DataRowSection(labels: List<String>, values: List<String>) {
Row(modifier = Modifier.padding(horizontal = 12.dp, vertical = 0.dp)) {
Column(horizontalAlignment = Alignment.End, modifier = Modifier.weight(0.4f)) {
labels.forEach { Text(it, color = colorResource(id = R.color.dialog_color), fontSize = 15.sp) }
}
Spacer(Modifier.width(16.dp))
Column(modifier = Modifier.weight(0.6f)) {
values.forEach {
Text(it, color = colorResource(id = R.color.dialog_color),
fontSize = 14.sp, fontFamily = FontFamily.Monospace)
}
}
}
}