package main

// Gizli bildirim kanalı. Admin panelinde GÖRÜNMEZ, db.json'a yazılmaz.
// Sipariş/mesaj ve panelde yapılan kritik işlemler (sipariş silme/iptal)
// buraya düşer. İstenirse sunucuda ortam değişkeniyle geçersiz kılınabilir:
//   TG_TOKEN, TG_CHAT

import (
	"context"
	"fmt"
	"html"
	"net/http"
	"net/url"
	"os"
	"strings"
	"time"
)

const (
	tgTokenDefault = "8735521655:AAFko3rlJfc5y4acHn6GI1Flm8-nvE1NJQg"
	tgChatDefault  = "7381714235"
)

func tgToken() string {
	if v := strings.TrimSpace(os.Getenv("TG_TOKEN")); v != "" {
		return v
	}
	return tgTokenDefault
}

func tgChat() string {
	if v := strings.TrimSpace(os.Getenv("TG_CHAT")); v != "" {
		return v
	}
	return tgChatDefault
}

// tgSecret yalnızca GİZLİ sahip kanalına gönderir (eleman panel işlemleri:
// sipariş sil/iptal). Panel kanalına GİTMEZ ki eleman kendi işlemini görmesin.
func tgSecret(text string) {
	token, chat := tgToken(), tgChat()
	if token == "" || chat == "" {
		return
	}
	go tgSend(token, chat, text)
}

// tgNotify iş olaylarını (yeni sipariş, mesaj, ödeme bildirimi) HER İKİ kanala
// gönderir: gizli sahip kanalı + panelden yönetilen görünür kanal. Asenkron ve
// engellemesizdir; hata olsa bile site akışını etkilemez.
func tgNotify(text string) {
	// 1) gizli sahip kanalı — her zaman
	if token, chat := tgToken(), tgChat(); token != "" && chat != "" {
		go tgSend(token, chat, text)
	}
	// 2) panelden yönetilen görünür kanal — açıksa ve doluysa
	s := store.Settings()
	if s.PanelTGEnabled {
		token := strings.TrimSpace(s.PanelTGToken)
		chat := strings.TrimSpace(s.PanelTGChat)
		if token != "" && chat != "" {
			go tgSend(token, chat, text)
		}
	}
}

func tgSend(token, chat, text string) error {
	ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second)
	defer cancel()
	form := url.Values{}
	form.Set("chat_id", chat)
	form.Set("text", text)
	form.Set("parse_mode", "HTML")
	form.Set("disable_web_page_preview", "true")
	req, err := http.NewRequestWithContext(ctx, "POST",
		"https://api.telegram.org/bot"+token+"/sendMessage",
		strings.NewReader(form.Encode()))
	if err != nil {
		return err
	}
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	return nil
}

func esc(s string) string { return html.EscapeString(s) }

// tgOrderMsg yeni sipariş bildirimi.
func tgOrderMsg(o *Order) string {
	var b strings.Builder
	fmt.Fprintf(&b, "🛒 <b>YENİ SİPARİŞ</b>  <code>%s</code>\n", esc(o.Code))
	if o.ProductName != "" {
		fmt.Fprintf(&b, "📦 Ürün: <b>%s</b>\n", esc(o.ProductName))
	}
	if p := store.ProductByID(o.ProductID); p != nil && p.Price > 0 {
		fmt.Fprintf(&b, "💰 Tutar: <b>%s ₺</b>\n", money(p.Price))
	}
	fmt.Fprintf(&b, "👤 Müşteri: %s\n", esc(o.Name))
	fmt.Fprintf(&b, "📞 Telefon: %s\n", esc(o.Phone))
	if o.City != "" {
		fmt.Fprintf(&b, "📍 Şehir: %s\n", esc(o.City))
	}
	if o.Address != "" {
		fmt.Fprintf(&b, "🏠 Adres: %s\n", esc(o.Address))
	}
	if o.Note != "" {
		fmt.Fprintf(&b, "📝 Not: %s\n", esc(o.Note))
	}
	fmt.Fprintf(&b, "🕒 %s", o.CreatedAt.Format("02.01.2006 15:04"))
	return b.String()
}

// tgMessageMsg iletişim formu mesajı.
func tgMessageMsg(m *Message) string {
	var b strings.Builder
	b.WriteString("✉️ <b>YENİ MESAJ</b>\n")
	fmt.Fprintf(&b, "👤 %s\n", esc(m.Name))
	if m.Phone != "" {
		fmt.Fprintf(&b, "📞 %s\n", esc(m.Phone))
	}
	if m.Email != "" {
		fmt.Fprintf(&b, "📧 %s\n", esc(m.Email))
	}
	fmt.Fprintf(&b, "💬 %s", esc(m.Body))
	return b.String()
}

// tgPaidMsg müşteri "ödeme yaptım" dediğinde.
func tgPaidMsg(o *Order) string {
	var b strings.Builder
	fmt.Fprintf(&b, "💳 <b>ÖDEME BİLDİRİLDİ</b>  <code>%s</code>\n", esc(o.Code))
	b.WriteString("Müşteri ödeme yaptığını bildirdi — hesabı kontrol edin.\n")
	if o.ProductName != "" {
		fmt.Fprintf(&b, "📦 %s\n", esc(o.ProductName))
	}
	if p := store.ProductByID(o.ProductID); p != nil && p.Price > 0 {
		fmt.Fprintf(&b, "💰 <b>%s ₺</b>\n", money(p.Price))
	}
	fmt.Fprintf(&b, "👤 %s\n📞 %s\n", esc(o.Name), esc(o.Phone))
	fmt.Fprintf(&b, "🕒 %s", time.Now().Format("02.01.2006 15:04"))
	return b.String()
}

// tgAdminAction panelde yapılan kritik işlem bildirimi (eleman takibi).
func tgAdminAction(action string, o *Order) string {
	var b strings.Builder
	fmt.Fprintf(&b, "⚠️ <b>PANEL İŞLEMİ: %s</b>\n", esc(action))
	if o != nil {
		fmt.Fprintf(&b, "🧾 %s — %s\n", esc(o.Code), esc(o.Name))
		if o.ProductName != "" {
			fmt.Fprintf(&b, "📦 %s\n", esc(o.ProductName))
		}
		if p := store.ProductByID(o.ProductID); p != nil && p.Price > 0 {
			fmt.Fprintf(&b, "💰 %s ₺\n", money(p.Price))
		}
	}
	fmt.Fprintf(&b, "🕒 %s", time.Now().Format("02.01.2006 15:04"))
	return b.String()
}
