package main

import (
	"context"
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"strings"
)

type twilio struct {
	accountSID   string
	accountToken string
}

type incomingPhoneNumber struct {
	FriendlyName string `json:"friendly_name"`
	SMSMethod    string `json:"sms_method"`
	SMSURL       string `json:"sms_url"`
	SID          string `json:"sid"`
}

func (t *twilio) getIncomingPhoneNumbers(ctx context.Context) ([]incomingPhoneNumber, error) {
	url := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%s/IncomingPhoneNumbers.json", t.accountSID)
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	req.SetBasicAuth(t.accountSID, t.accountToken)
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}
	defer res.Body.Close()

	result := struct {
		Message string                `json:"message"`
		Status  int64                 `json:"status"`
		IPN     []incomingPhoneNumber `json:"incoming_phone_numbers"`
	}{}

	if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
		return nil, err
	}

	if result.Message != "" {
		return nil, fmt.Errorf("REST response error, status: %v, message: %q", result.Status, result.Message)
	}

	return result.IPN, nil
}

func (t *twilio) updateIncomingPhoneNumberSMSWebhook(ctx context.Context, sid, method, whurl string) error {
	turl := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%s/IncomingPhoneNumbers/%s.json", t.accountSID, sid)

	data := url.Values{}
	data.Set("SmsMethod", method)
	data.Set("SmsUrl", whurl)

	req, err := http.NewRequest("POST", turl, strings.NewReader(data.Encode()))
	if err != nil {
		return err
	}
	req = req.WithContext(ctx)
	req.SetBasicAuth(t.accountSID, t.accountToken)
	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return err
	}
	defer res.Body.Close()

	if res.StatusCode != 200 {
		return fmt.Errorf("status code: %v", res.StatusCode)
	}
	return nil
}
