"""
Página de gestión: añadir tickers personalizados y forzar descarga manual.
"""
import os
import dash
from dash import dcc, html, Input, Output, State, callback, dash_table, no_update
import dash_bootstrap_components as dbc
import yfinance as yf
import pandas as pd

from database import get_tickers_extra, añadir_ticker_extra, eliminar_ticker_extra
from activos import ACTIVOS
from scheduler import descargar_ticker, DATA_DIR

dash.register_page(__name__, path="/gestion", name="Gestión", order=4)

layout = dbc.Container(fluid=True, children=[
    dbc.Row(className="mt-3 mb-3", children=[
        dbc.Col(html.H4("Gestión de Valores"), width="auto"),
    ]),

    # ── Tickers incorporados ──────────────────────────────────────────────────
    dbc.Card(className="mb-4", children=[
        dbc.CardHeader(html.H6("Añadir ticker personalizado", className="mb-0")),
        dbc.CardBody([
            dbc.Row(className="g-2 align-items-end", children=[
                dbc.Col([
                    dbc.Label("Nombre (sin espacios, usar _)"),
                    dbc.Input(id="gest-nombre", placeholder="ej. Tesla"),
                ], md=3),
                dbc.Col([
                    dbc.Label("Ticker Yahoo Finance"),
                    dbc.Input(id="gest-ticker", placeholder="ej. TSLA"),
                ], md=2),
                dbc.Col([
                    dbc.Button("Añadir y descargar", id="gest-btn-add", color="primary", n_clicks=0),
                ], md=2),
                dbc.Col(html.Span(id="gest-msg", className="text-muted align-self-center")),
            ]),
        ]),
    ]),

    # ── Lista de extras ───────────────────────────────────────────────────────
    html.H5("Tickers personalizados activos"),
    html.Div(id="gest-tabla-extras", className="mb-4"),

    # ── Descarga manual forzada ───────────────────────────────────────────────
    dbc.Card(className="mb-4", children=[
        dbc.CardHeader(html.H6("Actualización manual", className="mb-0")),
        dbc.CardBody([
            dbc.Row(className="g-2 align-items-end", children=[
                dbc.Col([
                    dbc.Label("Valor a actualizar"),
                    dcc.Dropdown(id="gest-actualizar-empresa", clearable=False),
                ], md=4),
                dbc.Col([
                    dbc.Button("Actualizar ahora", id="gest-btn-update", color="success", n_clicks=0),
                ], md=2),
                dbc.Col(html.Span(id="gest-update-msg", className="text-muted align-self-center")),
            ]),
        ]),
    ]),

    # ── Estado de los archivos CSV ────────────────────────────────────────────
    html.H5("Estado de los datos descargados"),
    html.Div(id="gest-estado-csvs", className="mb-4"),

    dcc.Store(id="gest-refresh", data=0),
])


@callback(
    Output("gest-refresh", "data"),
    Output("gest-msg", "children"),
    Input("gest-btn-add", "n_clicks"),
    State("gest-nombre", "value"),
    State("gest-ticker", "value"),
    State("gest-refresh", "data"),
    prevent_initial_call=True,
)
def añadir_ticker(_, nombre, ticker, refresh):
    if not nombre or not ticker:
        return no_update, "Indica nombre y ticker."
    nombre = nombre.strip().replace(" ", "_")
    ticker = ticker.strip().upper()

    # Verificar que existe en Yahoo Finance
    try:
        info = yf.Ticker(ticker).history(period="5d")
        if info.empty:
            return no_update, f"No se encontraron datos para '{ticker}' en Yahoo Finance."
    except Exception as e:
        return no_update, f"Error al verificar ticker: {e}"

    añadir_ticker_extra(nombre, ticker)
    descargar_ticker(nombre, ticker)
    return (refresh or 0) + 1, f"✓ '{nombre}' ({ticker}) añadido y descargado."


@callback(
    Output("gest-tabla-extras", "children"),
    Output("gest-actualizar-empresa", "options"),
    Output("gest-estado-csvs", "children"),
    Input("gest-refresh", "data"),
)
def actualizar_vista(_):
    extras = get_tickers_extra()

    tabla_extras = dash_table.DataTable(
        data=[{"Nombre": r["nombre"], "Ticker": r["ticker"]} for r in extras],
        columns=[{"name": "Nombre", "id": "Nombre"}, {"name": "Ticker", "id": "Ticker"}],
        style_cell={"textAlign": "left", "padding": "6px 12px"},
        style_header={"fontWeight": "bold", "backgroundColor": "#f0f0f0"},
        page_size=10,
    ) if extras else html.P("Sin tickers personalizados.", className="text-muted")

    # Opciones para el desplegable de actualización manual
    extra_dict = {r["nombre"]: r["ticker"] for r in extras}
    todos = {**ACTIVOS, **extra_dict}
    opciones = [{"label": k.replace("_", " "), "value": k} for k in sorted(todos)]

    # Estado de CSVs
    filas_csv = []
    for nombre in sorted(todos.keys()):
        ruta = os.path.join(DATA_DIR, f"historico_{nombre}.csv")
        if os.path.exists(ruta):
            mtime = pd.Timestamp(os.path.getmtime(ruta), unit="s", tz="UTC").tz_convert("Europe/Madrid")
            tam = os.path.getsize(ruta) // 1024
            try:
                dh = pd.read_csv(ruta, index_col=0, skiprows=[1, 2], header=0)
                dh.index = pd.to_datetime(dh.index, errors="coerce")
                ultima = dh.index.max().strftime("%Y-%m-%d") if dh.index.notna().any() else "—"
            except Exception:
                ultima = "?"
            filas_csv.append({
                "Valor": nombre.replace("_", " "),
                "Última sesión": ultima,
                "Actualizado": mtime.strftime("%Y-%m-%d %H:%M"),
                "Tamaño (KB)": tam,
                "Estado": "✓ OK",
            })
        else:
            filas_csv.append({
                "Valor": nombre.replace("_", " "),
                "Última sesión": "—",
                "Actualizado": "—",
                "Tamaño (KB)": 0,
                "Estado": "⚠ Sin datos",
            })

    tabla_csvs = dash_table.DataTable(
        data=filas_csv,
        columns=[{"name": c, "id": c} for c in ["Valor", "Última sesión", "Actualizado", "Tamaño (KB)", "Estado"]],
        style_cell={"textAlign": "left", "padding": "5px 10px"},
        style_header={"fontWeight": "bold", "backgroundColor": "#f0f0f0"},
        style_data_conditional=[
            {"if": {"filter_query": '{Estado} contains "⚠"'}, "color": "#C62828"},
            {"if": {"filter_query": '{Estado} contains "✓"'}, "color": "#2E7D32"},
        ],
        page_size=20,
        sort_action="native",
        filter_action="native",
    )

    return tabla_extras, opciones, tabla_csvs


@callback(
    Output("gest-update-msg", "children"),
    Input("gest-btn-update", "n_clicks"),
    State("gest-actualizar-empresa", "value"),
    prevent_initial_call=True,
)
def actualizar_manual(_, empresa):
    if not empresa:
        return "Selecciona un valor."
    extra = {r["nombre"]: r["ticker"] for r in get_tickers_extra()}
    todos = {**ACTIVOS, **extra}
    ticker = todos.get(empresa)
    if not ticker:
        return f"Ticker no encontrado para '{empresa}'."
    try:
        descargar_ticker(empresa, ticker)
        return f"✓ '{empresa.replace('_',' ')}' actualizado correctamente."
    except Exception as e:
        return f"Error: {e}"
