package storage

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
)

type RemoteClient struct {
	ServerURL string
}

func (c *RemoteClient) ReadFile(path string) ([]byte, error) {
	url := fmt.Sprintf("%s/%s", c.ServerURL, path)
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		panic(err)
	}
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}
	if res.StatusCode != 200 {
		panic(res.Status)
	}
	b, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	return b, nil
}

func (c *RemoteClient) ReadDir(path string) ([]string, error) {
	url := fmt.Sprintf("%s/%s", c.ServerURL, path)
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		panic(err)
	}
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}
	if res.StatusCode != 200 {
		panic(res.Status)
	}
	entries := []string{}
	json.NewDecoder(res.Body).Decode(&entries)
	return entries, nil
}

func (c *RemoteClient) WriteFile(path string, data []byte) error {
	url := fmt.Sprintf("%s/%s", c.ServerURL, path)
	req, err := http.NewRequest("PUT", url, bytes.NewReader(data))
	if err != nil {
		panic(err)
	}
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return err
	}
	if res.StatusCode != 200 {
		panic(res.Status)
	}
	return nil
}

func (c *RemoteClient) Delete(path string) error {
	url := fmt.Sprintf("%s/%s", c.ServerURL, path)
	req, err := http.NewRequest("DELETE", url, nil)
	if err != nil {
		panic(err)
	}
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return err
	}
	if res.StatusCode != 200 {
		panic(res.Status)
	}
	return nil
}
