package banking import ( "bytes" "context" "encoding/json" "fmt" "net/http" "time" ) // BankingClient provides access to backend banking services type BankingClient struct { baseURL string httpClient *http.Client } // NewBankingClient creates a new banking client func NewBankingClient(baseURL string) *BankingClient { return &BankingClient{ baseURL: baseURL, httpClient: &http.Client{ Timeout: 10 * time.Second, }, } } // GetAccountStatus gets account status from banking service func (c *BankingClient) GetAccountStatus(ctx context.Context, accountID string) (map[string]interface{}, error) { url := fmt.Sprintf("%s/api/v1/banking/accounts/%s", c.baseURL, accountID) req, err := http.NewRequestWithContext(ctx, "GET", url, nil) if err != nil { return nil, err } resp, err := c.httpClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("unexpected status: %d", resp.StatusCode) } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return nil, err } return result, nil } // CreateTicket creates a support ticket func (c *BankingClient) CreateTicket(ctx context.Context, subject, details string) (map[string]interface{}, error) { url := fmt.Sprintf("%s/api/v1/banking/tickets", c.baseURL) payload := map[string]string{ "subject": subject, "details": details, } jsonData, err := json.Marshal(payload) if err != nil { return nil, err } req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(jsonData)) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/json") resp, err := c.httpClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusCreated { return nil, fmt.Errorf("unexpected status: %d", resp.StatusCode) } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return nil, err } return result, nil }