package clients

import (
	"context"

	firebase "firebase.google.com/go/v4"
	"firebase.google.com/go/v4/messaging"
	"github.com/rs/zerolog/log"
	"github.com/sideshow/apns2"
	"github.com/sideshow/apns2/token"
	"github.com/spf13/viper"
	"google.golang.org/api/option"
)

var (
	apnsClient     *apns2.Client
	firebaseClient *messaging.Client
)

func InitPushClients() {
	// Initialize APNs Client
	apnsCertPath := viper.GetString("apns.certificate_path")
	apnsKeyID := viper.GetString("apns.key_id")
	apnsTeamID := viper.GetString("apns.team_id")

	if apnsCertPath != "" && apnsKeyID != "" && apnsTeamID != "" {
		authKey, err := token.AuthKeyFromFile(apnsCertPath)
		token := &token.Token{
			AuthKey: authKey,
			KeyID:   apnsKeyID,
			TeamID:  apnsTeamID,
		}
		if err != nil {
			log.Fatal().Err(err).Msg("Failed to create APNs auth key")
		}
		apnsClient = apns2.NewTokenClient(token)
		apnsClient.Production() // Use Production environment
		log.Info().Msg("APNs client initialized in production mode")
	} else {
		log.Warn().Msg("APNs configuration missing. Skipping APNs client initialization.")
	}

	// Initialize Firebase Client
	firebaseServiceAccountPath := viper.GetString("firebase.service_account_path")
	if firebaseServiceAccountPath != "" {
		opt := option.WithCredentialsFile(firebaseServiceAccountPath)
		app, err := firebase.NewApp(context.Background(), nil, opt)
		if err != nil {
			log.Fatal().Err(err).Msg("Failed to create Firebase app")
		}
		firebaseClient, err = app.Messaging(context.Background())
		if err != nil {
			log.Fatal().Err(err).Msg("Failed to create Firebase Messaging client")
		}
		log.Info().Msg("Firebase Messaging client initialized")
	} else {
		log.Warn().Msg("Firebase service account path missing. Skipping Firebase client initialization.")
	}
}

func GetAPNsClient() *apns2.Client {
	return apnsClient
}

func GetFirebaseClient() *messaging.Client {
	return firebaseClient
}
