package main

import (
"html/template"
    "net/http"
    "strconv"
)

var formTemplate = `
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Investment Calculator</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>

<body>
    <div class="container">
        <h1>Investment Calculator</h1>
        <form method="post">
            <div class="mb-3">
                <label for="maas" class="form-label">Monthly Salary</label>
                <input type="number" step="0.0001" class="form-control" id="maas" name="maas" value="{{.Maas}}" required>
            </div>
            <div class="mb-3">
                <label for="yatirimOrani" class="form-label">Investment Ratio (as a decimal)</label>
                <input type="number" step="0.0001" class="form-control" id="yatirimOrani" name="yatirimOrani" value="{{.YatirimOrani}}" required>
            </div>
            <div class="mb-3">
                <label for="aylikFaizOrani" class="form-label">Monthly Interest Rate (as a decimal)</label>
                <input type="number" step="0.0001" class="form-control" id="aylikFaizOrani" name="aylikFaizOrani" value="{{.AylikFaizOrani}}" required>
            </div>
            <div class="mb-3">
                <label for="yillikZamOrani" class="form-label">Annual Raise Rate (as a decimal)</label>
                <input type="number" step="0.0001" class="form-control" id="yillikZamOrani" name="yillikZamOrani" value="{{.YillikZamOrani}}" required>
            </div>
            <div class="mb-3">
                <label for="hedefBakiye" class="form-label">Target Balance</label>
                <input type="number" step="0.0001" class="form-control" id="hedefBakiye" name="hedefBakiye" value="{{.HedefBakiye}}" required>
            </div>
            <div class="mb-3 form-check">
                <input type="checkbox" class="form-check-input" id="mevcutBirikimVar" name="mevcutBirikimVar" {{if .MevcutBirikimVar}}checked{{end}}>
                <label class="form-check-label" for="mevcutBirikimVar">Do you have existing savings?</label>
            </div>
            <div class="mb-3">
                <label for="mevcutBirikim" class="form-label">Existing Savings</label>
                <input type="number" step="0.0001" class="form-control" id="mevcutBirikim" name="mevcutBirikim" value="{{.MevcutBirikim}}">
            </div>
            <button type="submit" class="btn btn-primary">Calculate</button>
        </form>
    </div>
</body>

</html>
`

var resultTemplate = `
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Investment Result</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>

<body>
    <div class="container">
        <h1>Investment Result</h1>
        <p>Total Savings: ${{printf "%.2f" .Total}}</p>
        <p>Cost: ${{printf "%.2f" .Maliyet}}</p>
        <p>Months: {{printf "%.0f" .Ay}}</p>
        <p>Monthly Salary: ${{printf "%.0f" .Maas}}</p>
        <p>Existing Savings: ${{printf "%.2f" .MevcutBirim}}</p>
        <form action="/" method="get">
            <button type="submit" class="btn btn-primary">New Calculation</button>
        </form>
    </div>
</body>

</html>
`

type FormData struct {
Maas float64
    YatirimOrani     float64
    AylikFaizOrani   float64
    YillikZamOrani   float64
    HedefBakiye      float64
    MevcutBirikimVar bool
    MevcutBirikim    float64
}

var lastCalculation FormData

func getiriAylik(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
tmpl := template.Must(template.New("index").Parse(formTemplate))
tmpl.Execute(w, lastCalculation)
} else if r.Method == "POST" {
r.ParseForm()

maas, _ := strconv.ParseFloat(r.Form.Get("maas"), 64)
yatirimOrani, _ := strconv.ParseFloat(r.Form.Get("yatirimOrani"), 64)
aylikFaizOrani, _ := strconv.ParseFloat(r.Form.Get("aylikFaizOrani"), 64)
yillikZamOrani, _ := strconv.ParseFloat(r.Form.Get("yillikZamOrani"), 64)
hedefBakiye, _ := strconv.ParseFloat(r.Form.Get("hedefBakiye"), 64)
var mevcutBirikim float64

       if r.Form.Get("mevcutBirikimVar") == "on" {
mevcutBirikim, _ = strconv.ParseFloat(r.Form.Get("mevcutBirikim"), 64)
}

var aylikYatirilan, total, ay, maliyet float64 = 0, mevcutBirikim, 0, 0

       for total < hedefBakiye {
for i := 0; i < 12; i++ {
aylikYatirilan = maas * yatirimOrani
maliyet += aylikYatirilan
total = aylikYatirilan + (total * (1 + aylikFaizOrani))
ay++
if total > hedefBakiye {
break
             }
}

maas = maas // Maaş artışı olmadığı için maaş değerini aynen kullanıyoruz.
          aylikYatirilan = 0
       }

lastCalculation = FormData{
Maas: maas, // Stringi doğrudan kullanıyoruz.
          YatirimOrani: yatirimOrani,
AylikFaizOrani: aylikFaizOrani,
YillikZamOrani: yillikZamOrani,
HedefBakiye: hedefBakiye,
MevcutBirikimVar: r.Form.Get("mevcutBirikimVar") == "on",
MevcutBirikim: mevcutBirikim,
}

result := struct {
Total float64
          Maliyet     float64
          Ay          float64
          Maas        float64
          MevcutBirim float64
       }{
Total: total,
Maliyet: maliyet,
Ay: ay,
Maas: maas,
MevcutBirim: mevcutBirikim,
}

tmpl := template.Must(template.New("result").Parse(resultTemplate))
tmpl.Execute(w, result)
}
}

func main() {
http.HandleFunc("/", getiriAylik)
http.ListenAndServe(":8080", nil)
}

calıştırmak için

go run main.go