import axios from 'axios';
import { z } from 'zod';

export const GithubRepositorySchema = z.object({
    id: z.number(),
    name: z.string(),
    full_name: z.string(),
    html_url: z.string(),
    ssh_url: z.string(),
});

export type GithubRepository = z.infer<typeof GithubRepositorySchema>;

export class GithubClient {
    private token: string;

    constructor(token: string) {
        this.token = token;
    }

    private getHeaders() {
        return {
            "Authorization": `Bearer ${this.token}`,
            "Accept": "application/vnd.github.v3+json",
        };
    }

    async getRepositories(): Promise<GithubRepository[]> {
        const response = await axios.get("https://api.github.com/user/repos", {
            headers: this.getHeaders(),
        });
        return z.array(GithubRepositorySchema).parse(response.data);
    }

    async addDeployKey(repoPath: string, key: string) {
        const sshUrl = repoPath;
        const repoOwnerAndName = sshUrl.replace('git@github.com:', '').replace('.git', '');

        await axios.post(
            `https://api.github.com/repos/${repoOwnerAndName}/keys`,
            {
                title: "dodo",
                key: key,
                read_only: true
            },
            {
                headers: this.getHeaders(),
            }
        );
    }
} 