package service

import (
	"crawler/config"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"time"
)

type Rest struct{}

// REST API 호출
func (this *Rest) CallRestGetAPI(url string) ([]byte, error) {
	// API 호출
	req, err := http.NewRequest("GET", url, nil)
	if this.Check(err) {
		return nil, err
	}

	// 웹 수집을 위한 Crawler Header 값 추가
	req.Header.Set("Accept", "application/json")
	req.Header.Add("User-Agent", "Crawler")

	client := &http.Client{
		Timeout: 8 * time.Second,
	}
	res, err := client.Do(req)
	if this.Check(err) {
		return nil, err
	}

	defer func(body io.ReadCloser) {
		this.Check(body.Close())
	}(res.Body)

	data, err := io.ReadAll(res.Body)
	if this.Check(err) {
		return nil, err
	}

	return data, nil
}

func (this *Rest) CallRestGet(url string) ([]byte, error) {
	// API 호출
	req, err := http.NewRequest("GET", url, nil)
	if this.Check(err) {
		return nil, err
	}

	// 웹 수집을 위한 Crawler Header 값 추가
	req.Header.Add("User-Agent", "Crawler")

	client := &http.Client{
		Timeout: 8 * time.Second,
	}
	res, err := client.Do(req)
	if this.Check(err) {
		return nil, err
	}

	defer func(body io.ReadCloser) {
		this.Check(body.Close())
	}(res.Body)

	data, err := io.ReadAll(res.Body)
	if this.Check(err) {
		return nil, err
	}

	return data, nil
}

// REST API 오류 확인
func (this *Rest) Check(err error) bool {
	if err != nil {
		this.WriteLog(err.Error())
		return true
	}
	return false
}

// Kobis 오류 기록
func (this *Rest) WriteLog(msg string) {
	data, err := os.OpenFile(config.ERROR_LOG_PATH_KOBIS, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatalln(err)
	}

	defer func() {
		if data.Close() != nil {
			fmt.Println(err)
		}
	}()

	log.SetOutput(data)
	log.Println(msg)
}
