//Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
//Copyright (C) 2024 HTWKalender support@htwkalender.de

//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU Affero General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU Affero General Public License for more details.

//You should have received a copy of the GNU Affero General Public License
//along with this program.  If not, see <https://www.gnu.org/licenses/>.

package fetch

import (
	"fmt"
	"io"
	"log/slog"
	"net/http"
	"time"
)

// getPlanHTML Get the HTML document from the specified URL

func GetHTML(url string) (string, error) {
	// Create HTTP client with timeout of 5 seconds
	client := http.Client{
		Timeout: 30 * time.Second,
	}
	return GetHTMLWithClient(url, &client)
}

func GetHTMLWithClient(url string, client *http.Client) (string, error) {

	// Send GET request
	response, err := client.Get(url)
	if err != nil {
		slog.Error("Error occurred while fetching the HTML document:", "error", err)
		return "", err
	}

	if response.StatusCode != 200 {
		slog.Warn("While fetching the HTML document, the server responded with status code: ", "status", response.StatusCode)
		return "", fmt.Errorf("server responded with status code: %d", response.StatusCode)
	}

	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			return
		}
	}(response.Body)

	// Read the response body
	body, err := io.ReadAll(response.Body)

	if err != nil {
		fmt.Printf("Error occurred while reading the response: %s\n", err.Error())
		return "", err
	}

	return toUtf8(body), err

}

func toUtf8(iso88591Buf []byte) string {
	buf := make([]rune, len(iso88591Buf))
	for i, b := range iso88591Buf {
		buf[i] = rune(b)
	}
	return string(buf)
}
