// storage_parrilla.rs — Lectura y escritura de archivos .mus de la parrilla musical
//
// Estructura en disco:
//   $HOME/.gradio/data/parrilla/{dia}/{hora}-{hora+1}.mus
//
// dia: 1=Lunes … 7=Domingo
// hora: 0..23  →  archivo "0-1.mus", "1-2.mus", …, "23-24.mus"
//
// Formato del archivo: una línea por ítem.
// Cada línea es una ruta (archivo, directorio con /* al final, o URL)
// o la palabra especial "Hora" que el reproductor interpreta como inserción de hora.

use std::fs;
use std::path::PathBuf;

// ─── Rutas ─────────────────────────────────────────────────────────────────

pub fn directorio_base() -> PathBuf {
    dirs::home_dir()
        .unwrap_or_else(std::env::temp_dir)
        .join(".gradio").join("data").join("parrilla")
}

/// Nombre del archivo para un día y hora dados
/// dia: 1-7, hora: 0-23
/// Formato: "{hora}-{hora+1}.mus"  →  "0-1.mus", "1-2.mus", …, "23-24.mus"
pub fn nombre_archivo(hora: u8) -> String {
    let siguiente = hora + 1; // No usar módulo — el sistema original usa 23-24.mus
    format!("{}-{}.mus", hora, siguiente)
}

pub fn ruta_archivo(dia: u8, hora: u8) -> PathBuf {
    directorio_base()
        .join(dia.to_string())
        .join(nombre_archivo(hora))
}

/// Crea todos los directorios necesarios (se llama al arranque)
pub fn crear_directorios() {
    let base = directorio_base();
    for dia in 1u8..=7 {
        let _ = fs::create_dir_all(base.join(dia.to_string()));
    }
}

// ─── Lectura ───────────────────────────────────────────────────────────────

/// Lee las líneas de un archivo .mus (puede incluir "Hora" como ítem especial)
pub fn leer_items(dia: u8, hora: u8) -> Vec<String> {
    let ruta = ruta_archivo(dia, hora);
    match fs::read_to_string(&ruta) {
        Ok(contenido) => contenido
            .lines()
            .map(|l| l.trim().to_string())
            .filter(|l| !l.is_empty())
            .collect(),
        Err(_) => Vec::new(),
    }
}

// ─── Escritura ─────────────────────────────────────────────────────────────

/// Escribe los ítems al archivo .mus
pub fn escribir_items(dia: u8, hora: u8, items: &[String]) {
    let ruta = ruta_archivo(dia, hora);
    if let Some(padre) = ruta.parent() {
        let _ = fs::create_dir_all(padre);
    }
    let contenido = items.join("\n") + "\n";
    let _ = fs::write(&ruta, contenido);
}

// ─── Operaciones de edición ────────────────────────────────────────────────

pub fn agregar_item(dia: u8, hora: u8, item: String) {
    let mut items = leer_items(dia, hora);
    items.push(item);
    escribir_items(dia, hora, &items);
}

pub fn mover_item(dia: u8, hora: u8, indice: usize, subir: bool) {
    let mut items = leer_items(dia, hora);
    if subir && indice > 0 {
        items.swap(indice, indice - 1);
    } else if !subir && indice + 1 < items.len() {
        items.swap(indice, indice + 1);
    } else {
        return;
    }
    escribir_items(dia, hora, &items);
}

pub fn eliminar_item(dia: u8, hora: u8, indice: usize) {
    let mut items = leer_items(dia, hora);
    if indice < items.len() {
        items.remove(indice);
        escribir_items(dia, hora, &items);
    }
}

// ─── Pisadores por hora ────────────────────────────────────────────────────

/// Ruta del archivo de carpeta de pisadores para un día y hora
pub fn ruta_pisador(dia: u8, hora: u8) -> PathBuf {
    directorio_base()
        .join(dia.to_string())
        .join(format!("{}-{}.pisador", hora, hora + 1))
}

/// Lee la carpeta de pisadores específica para esta hora (o "" si no está configurada)
pub fn leer_pisador_dir(dia: u8, hora: u8) -> String {
    fs::read_to_string(ruta_pisador(dia, hora))
        .map(|s| s.trim().to_string())
        .unwrap_or_default()
}

/// Guarda la carpeta de pisadores para esta hora (borra el archivo si dir está vacío)
pub fn escribir_pisador_dir(dia: u8, hora: u8, dir: &str) {
    let ruta = ruta_pisador(dia, hora);
    if dir.trim().is_empty() {
        let _ = fs::remove_file(&ruta);
    } else {
        let _ = fs::write(&ruta, dir.trim());
    }
}

// ─── Operaciones de copia ──────────────────────────────────────────────────

/// Copia la parrilla de (dia_origen, hora_origen) a (dia_destino, hora_destino)
pub fn copiar_hora(dia_orig: u8, hora_orig: u8, dia_dest: u8, hora_dest: u8) {
    let items = leer_items(dia_orig, hora_orig);
    escribir_items(dia_dest, hora_dest, &items);
    let pis = leer_pisador_dir(dia_orig, hora_orig);
    escribir_pisador_dir(dia_dest, hora_dest, &pis);
}

/// Copia todas las horas de dia_origen a dia_destino (incluye carpetas de pisadores)
pub fn copiar_dia(dia_orig: u8, dia_dest: u8) {
    for hora in 0u8..24 {
        copiar_hora(dia_orig, hora, dia_dest, hora);
    }
}
