// Copyright (c) 2021 - 2024, Ludvig Lundgren and the autobrr contributors.
// SPDX-License-Identifier: GPL-2.0-or-later

package porla

import (
	"io"
	"log"
	"net/http"
	"strings"
	"time"

	"github.com/autobrr/autobrr/pkg/jsonrpc"
	"github.com/autobrr/autobrr/pkg/sharedhttp"
)

var (
	DefaultTimeout = 60 * time.Second
)

type Client struct {
	Name      string
	Hostname  string
	cfg       Config
	rpcClient jsonrpc.Client
	http      *http.Client
	timeout   time.Duration

	log *log.Logger
}

type Config struct {
	Hostname  string
	AuthToken string

	// TLS skip cert validation
	TLSSkipVerify bool

	// HTTP Basic auth username
	BasicUser string

	// HTTP Basic auth password
	BasicPass string

	Timeout int
	Log     *log.Logger
}

func NewClient(cfg Config) *Client {
	c := &Client{
		cfg:     cfg,
		log:     log.New(io.Discard, "", log.LstdFlags),
		timeout: DefaultTimeout,
	}

	// override logger if we pass one
	if cfg.Log != nil {
		c.log = cfg.Log
	}

	if cfg.Timeout > 0 {
		c.timeout = time.Duration(cfg.Timeout) * time.Second
	}

	httpClient := &http.Client{
		Timeout:   c.timeout,
		Transport: sharedhttp.Transport,
	}

	if cfg.TLSSkipVerify {
		httpClient.Transport = sharedhttp.TransportTLSInsecure
	}

	c.http = httpClient

	token := cfg.AuthToken

	if !strings.HasPrefix(token, "Bearer ") {
		token = "Bearer " + token
	}

	c.rpcClient = jsonrpc.NewClientWithOpts(cfg.Hostname+"/api/v1/jsonrpc", &jsonrpc.ClientOpts{
		Headers: map[string]string{
			"X-Porla-Token": token,
		},
		HTTPClient: httpClient,
		BasicUser:  cfg.BasicUser,
		BasicPass:  cfg.BasicPass,
	})

	return c
}
