"""
stock_analysis.jl

Télécharge l'historique complet d'un actif via Yahoo Finance et génère un graphe
avec 4 panneaux :
  1. Prix de clôture ajusté (splits + dividendes)
  2. Rendements simples (sans dividendes)
  3. Rendements simples avec dividendes (Total Return)
  4. Log-rendements (sans dividendes)

Les rendements sont calculés sur le cours de clôture brut (`close`, ajusté des
splits seulement) : utiliser `adjclose`, déjà ajusté des dividendes, reviendrait
à les compter deux fois dans le Total Return.

Usage :
    julia stock_analysis.jl AAPL
    julia stock_analysis.jl MSFT
"""

using Pkg

# ── Installer les dépendances si nécessaire ──────────────────────────────────
for pkg in ["HTTP", "JSON3", "DataFrames", "Dates", "Plots", "Statistics"]
    try
        @eval using $(Symbol(pkg))
    catch
        Pkg.add(pkg)
        @eval using $(Symbol(pkg))
    end
end

using HTTP, JSON3, DataFrames, Dates, Plots, Statistics

# ── Paramètre : ticker en argument ou valeur par défaut ─────────────────────
ticker = length(ARGS) > 0 ? uppercase(ARGS[1]) : "AAPL"
println("📈 Analyse de : $ticker")

# ── Téléchargement des données Yahoo Finance ─────────────────────────────────
"""
    fetch_yahoo(ticker; period1, period2, interval)

Télécharge les données OHLCV + dividendes depuis Yahoo Finance v8.
Retourne un DataFrame trié par date.
"""
function fetch_yahoo(ticker::String;
                     period1::Int = 0,          # timestamp Unix (0 = début)
                     period2::Int = round(Int, datetime2unix(now())),
                     interval::String = "1d")

    url = "https://query1.finance.yahoo.com/v8/finance/chart/$ticker" *
          "?period1=$period1&period2=$period2&interval=$interval&events=dividends"

    headers = ["User-Agent" => "Mozilla/5.0"]
    resp = HTTP.get(url, headers)
    data = JSON3.read(String(resp.body))

    result = data["chart"]["result"][1]
    timestamps = result["timestamp"]
    quote_data = result["indicators"]["quote"][1]
    rawclose   = quote_data["close"]                                 # ajusté des splits seulement
    adjclose   = result["indicators"]["adjclose"][1]["adjclose"]    # splits + dividendes

    # Dividendes (peut être absent)
    div_dict = Dict{Date, Float64}()
    if haskey(result, "events") && haskey(result["events"], "dividends")
        for (_, v) in result["events"]["dividends"]
            d = unix2datetime(v["date"]) |> Date
            div_dict[d] = v["amount"]
        end
    end

    n = length(timestamps)
    dates    = [unix2datetime(ts) |> Date for ts in timestamps]
    tofloat(x) = x === nothing ? NaN : Float64(x)
    closes   = [tofloat(rawclose[i]) for i in 1:n]
    adjs     = [tofloat(adjclose[i]) for i in 1:n]
    volumes  = [quote_data["volume"][i] === nothing ? 0 : Int(quote_data["volume"][i]) for i in 1:n]
    divs     = [get(div_dict, dates[i], 0.0) for i in 1:n]

    df = DataFrame(date=dates, close=closes, adjclose=adjs, volume=volumes, dividend=divs)
    sort!(df, :date)
    # Supprimer les lignes avec NaN
    filter!(row -> !isnan(row.close) && row.close > 0 && !isnan(row.adjclose) && row.adjclose > 0, df)
    return df
end

df = fetch_yahoo(ticker)
println("✅ $(nrow(df)) observations du $(df.date[1]) au $(df.date[end])")

# ── Calcul des rendements ────────────────────────────────────────────────────
n = nrow(df)

# Rendements simples sans dividendes : r_t = P_t/P_{t-1} - 1
simple_ret = [df.close[i] / df.close[i-1] - 1.0 for i in 2:n]

# Rendements simples avec dividendes : r_t = (P_t + D_t) / P_{t-1} - 1
total_ret  = [(df.close[i] + df.dividend[i]) / df.close[i-1] - 1.0 for i in 2:n]

# Log-rendements : ln(P_t / P_{t-1})
log_ret    = [log(df.close[i] / df.close[i-1]) for i in 2:n]

dates_ret  = df.date[2:end]

# ── Statistiques sommaires ───────────────────────────────────────────────────
println("\n📊 Statistiques des rendements journaliers :")
println("  Simple (sans div) — μ=$(round(mean(simple_ret)*100,digits=4))%  σ=$(round(std(simple_ret)*100,digits=4))%")
println("  Simple (avec div) — μ=$(round(mean(total_ret)*100,digits=4))%   σ=$(round(std(total_ret)*100,digits=4))%")
println("  Log-rendements    — μ=$(round(mean(log_ret)*100,digits=4))%     σ=$(round(std(log_ret)*100,digits=4))%")

# ── Graphique ────────────────────────────────────────────────────────────────
gr(size=(1200, 900))

p1 = plot(df.date, df.adjclose,
    label="Prix ajusté (\$)",
    color=:steelblue, linewidth=1.5,
    title="$ticker — Prix de clôture ajusté",
    ylabel="Prix (\$)", xlabel="",
    legend=:topleft, grid=true)

p2 = plot(dates_ret, simple_ret .* 100,
    label="Rendement simple",
    color=:darkorange, linewidth=0.8, alpha=0.7,
    title="Rendements simples (sans dividendes)",
    ylabel="Rendement (%)", xlabel="",
    legend=:topright, grid=true)
hline!(p2, [0], color=:black, linewidth=0.8, label="")

p3 = plot(dates_ret, total_ret .* 100,
    label="Total Return (avec div.)",
    color=:green, linewidth=0.8, alpha=0.7,
    title="Rendements simples (avec dividendes)",
    ylabel="Rendement (%)", xlabel="",
    legend=:topright, grid=true)
hline!(p3, [0], color=:black, linewidth=0.8, label="")

p4 = plot(dates_ret, log_ret .* 100,
    label="Log-rendement",
    color=:purple, linewidth=0.8, alpha=0.7,
    title="Log-rendements",
    ylabel="Log-rendement (%)", xlabel="Date",
    legend=:topright, grid=true)
hline!(p4, [0], color=:black, linewidth=0.8, label="")

fig = plot(p1, p2, p3, p4,
    layout=(4,1),
    plot_title="$ticker — Analyse des rendements",
    left_margin=10Plots.mm,
    bottom_margin=5Plots.mm)

output_file = "$(ticker)_analysis.png"
savefig(fig, output_file)
println("\n💾 Graphique sauvegardé : $output_file")
display(fig)
