package common

/*
 * This file is part of Autogits.
 *
 * Copyright © 2024 SUSE LLC
 *
 * Autogits is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 2 of the License, or (at your option) any later
 * version.
 *
 * Autogits is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * Foobar. If not, see <https://www.gnu.org/licenses/>.
 */

import (
	"encoding/json"
	"fmt"
	"io"
	"strings"
)

type Commit struct {
	Id      string
	Message string
}

type PushWebhookEvent struct {
	Total_Commits int
	Head_Commit   Commit
	Commits       []Commit
	Pusher        User
	Sender        User

	Repository *Repository
}

func (*PushWebhookEvent) GetAction() string {
	return "push"
}

func (h *RequestHandler) parsePushRequest(data io.Reader) (*PushWebhookEvent, error) {
	action := new(PushWebhookEvent)
	err := json.NewDecoder(data).Decode(&action)

	if err != nil {
		return nil, fmt.Errorf("Got error while parsing: %w", err)
	}

	repoIdx := strings.LastIndex(action.Repository.Ssh_Url, "/")
	if repoIdx == -1 || action.Repository.Ssh_Url[repoIdx+1:] != action.Repository.Name+".git" {
		return nil, fmt.Errorf("Unexpected URL for SSH repository: '%s'", action.Repository.Name)
	}

	h.StdLogger.Printf("Request push for repo: %s\n", action.Repository.Full_Name)
	h.Request = &Request{
		Type: RequestType_Push,
		Data: action,
	}
	if len(action.Commits) < 1 || len(action.Head_Commit.Id) != 64 {
		return nil, fmt.Errorf("Request has no action .... skipping")
	}

	return action, nil
}