package main

import (
	"bytes"
	"net/http"
)

const (
	burl = "https://open.feishu.cn/open-apis"
)

type LarkFetchBiTableRecordsParams struct {
	ViewId    string `json:"viewId"`
	PageSize  string `json:"pageSize"`
	PageToken string `json:"pageToken"`
}

func fetchTenantAccessToken(reqBody *bytes.Buffer) (*http.Response, error) {
	resp, err := http.Post(burl+"/auth/v3/tenant_access_token/internal", "application/json", reqBody)
	return resp, err
}

func fetchUserAccessTokenInfo(reqBody *bytes.Buffer, tat string) (*http.Response, error) {
	req, err := http.NewRequest("POST", burl+"/authen/v1/access_token", reqBody)
	if err != nil {
		return nil, err
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+tat)
	resp, err := (&http.Client{}).Do(req)
	return resp, err
}

func fetchUserInfo(uat string) (*http.Response, error) {
	req, err := http.NewRequest("GET", burl+"/authen/v1/user_info", nil)
	if err != nil {
		return nil, err
	}
	req.Header.Set("Authorization", "Bearer "+uat)
	resp, err := (&http.Client{}).Do(req)
	return resp, err
}

func refreshUserToken(reqBody *bytes.Buffer, aat string) (*http.Response, error) {
	req, err := http.NewRequest("POST", burl+"/authen/v1/refresh_access_token", reqBody)
	if err != nil {
		return nil, err
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+aat)
	resp, err := (&http.Client{}).Do(req)
	return resp, err
}

func fetchBiTableRecords(uat string, appToken string, tableId string, params *LarkFetchBiTableRecordsParams) (*http.Response, error) {
	req, err := http.NewRequest("GET", burl+"/bitable/v1/apps/"+appToken+"/tables/"+tableId+"/records", nil)
	if err != nil {
		return nil, err
	}
	q := req.URL.Query()
	if params.ViewId != "" {
		q.Add("view_id", params.ViewId)
	}
	if params.PageToken != "" {
		q.Add("page_token", params.PageToken)
	}
	if params.PageSize != "" {
		q.Add("page_size", params.PageSize)
	} else {
		q.Add("page_size", "50")
	}
	req.URL.RawQuery = q.Encode()
	req.Header.Set("Authorization", "Bearer "+uat)
	return (&http.Client{}).Do(req)
}

func updateBiTableRecord(t string, appToken string, tableId string, recordId string, reqBody *bytes.Buffer) (*http.Response, error) {
	req, err := http.NewRequest("PUT", burl+"/bitable/v1/apps/"+appToken+"/tables/"+tableId+"/records/"+recordId, reqBody)
	if err != nil {
		return nil, err
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+t)
	resp, err := (&http.Client{}).Do(req)
	return resp, err
}

func batchInsertBiTableRecord(t string, appToken string, tableId string, reqBody *bytes.Buffer) (*http.Response, error) {
	req, err := http.NewRequest("POST", burl+"/bitable/v1/apps/"+appToken+"/tables/"+tableId+"/records/batch_create", reqBody)
	if err != nil {
		return nil, err
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+t)
	resp, err := (&http.Client{}).Do(req)
	return resp, err
}

func batchUpdateBiTableRecord(t string, appToken string, tableId string, reqBody *bytes.Buffer) (*http.Response, error) {
	req, err := http.NewRequest("POST", burl+"/bitable/v1/apps/"+appToken+"/tables/"+tableId+"/records/batch_update", reqBody)
	if err != nil {
		return nil, err
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+t)
	resp, err := (&http.Client{}).Do(req)
	return resp, err
}

func fetchBiTableCollaborators(uat string, reqBody *bytes.Buffer) (*http.Response, error) {
	req, err := http.NewRequest("POST", burl+"/drive/permission/member/list", reqBody)
	if err != nil {
		return nil, err
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+uat)
	resp, err := (&http.Client{}).Do(req)
	return resp, err
}
