import sqlite3
import os

DB_PATH = os.path.join(os.path.dirname(__file__), "bolsa.db")


def get_conn():
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    return conn


def init_db():
    with get_conn() as conn:
        conn.executescript("""
            CREATE TABLE IF NOT EXISTS transacciones (
                id          INTEGER PRIMARY KEY AUTOINCREMENT,
                modo        TEXT NOT NULL CHECK(modo IN ('real', 'simulacion')),
                empresa     TEXT NOT NULL,
                ticker      TEXT NOT NULL,
                tipo        TEXT NOT NULL CHECK(tipo IN ('compra', 'venta')),
                fecha       TEXT NOT NULL,
                cantidad    REAL NOT NULL,
                precio      REAL NOT NULL,
                comision    REAL NOT NULL DEFAULT 0,
                notas       TEXT
            );

            CREATE TABLE IF NOT EXISTS tickers_extra (
                nombre      TEXT PRIMARY KEY,
                ticker      TEXT NOT NULL UNIQUE,
                activo      INTEGER NOT NULL DEFAULT 1
            );
        """)


# ── Transacciones ──────────────────────────────────────────────────────────────

def añadir_transaccion(modo, empresa, ticker, tipo, fecha, cantidad, precio, comision=0, notas=""):
    with get_conn() as conn:
        conn.execute(
            """INSERT INTO transacciones
               (modo, empresa, ticker, tipo, fecha, cantidad, precio, comision, notas)
               VALUES (?,?,?,?,?,?,?,?,?)""",
            (modo, empresa, ticker, tipo, fecha, cantidad, precio, comision, notas),
        )


def eliminar_transaccion(id_):
    with get_conn() as conn:
        conn.execute("DELETE FROM transacciones WHERE id=?", (id_,))


def get_transacciones(modo):
    with get_conn() as conn:
        rows = conn.execute(
            "SELECT * FROM transacciones WHERE modo=? ORDER BY fecha DESC", (modo,)
        ).fetchall()
    return [dict(r) for r in rows]


def get_posiciones(modo):
    """Devuelve posiciones abiertas agregadas: empresa, cantidad neta, coste medio."""
    with get_conn() as conn:
        rows = conn.execute(
            """SELECT empresa, ticker,
                      SUM(CASE WHEN tipo='compra' THEN cantidad ELSE -cantidad END) AS cantidad_neta,
                      SUM(CASE WHEN tipo='compra' THEN cantidad*precio+comision
                               ELSE -(cantidad*precio-comision) END) AS coste_total
               FROM transacciones
               WHERE modo=?
               GROUP BY empresa, ticker
               HAVING cantidad_neta > 0.0001
               ORDER BY empresa""",
            (modo,),
        ).fetchall()
    return [dict(r) for r in rows]


# ── Tickers extra ──────────────────────────────────────────────────────────────

def get_tickers_extra():
    with get_conn() as conn:
        rows = conn.execute("SELECT * FROM tickers_extra WHERE activo=1").fetchall()
    return [dict(r) for r in rows]


def añadir_ticker_extra(nombre, ticker):
    with get_conn() as conn:
        conn.execute(
            "INSERT OR REPLACE INTO tickers_extra (nombre, ticker, activo) VALUES (?,?,1)",
            (nombre, ticker),
        )


def eliminar_ticker_extra(nombre):
    with get_conn() as conn:
        conn.execute("UPDATE tickers_extra SET activo=0 WHERE nombre=?", (nombre,))


init_db()
