<?php

namespace App\Http\Controllers;

use DateTime;
use OwenVoke\Gitea\Client;
use Illuminate\Http\Request;
use PhpOffice\PhpSpreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xls;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

class GiteaApiController extends Controller
{
    private $giteaClient;
    private $organization;

    public function __construct()
    {
        $this->organization = getenv('GITEA_ORGANIZATION');
        $this->giteaClient = new Client(null, null, getenv('GITEA_URL'));
        $this->giteaClient->authenticate(getenv('GITEA_TOKEN'), null, Client::AUTH_ACCESS_TOKEN);
    }

    private function get_repositories()
    {
        $repositories = $this->giteaClient->organizations()->repositories($this->organization, 1, 9999);
        return $repositories;
    }

    private function get_issues(string $repository, array $parameters = array())
    {
        return $issues = $this->giteaClient->repositories()->issues()->all($this->organization, $repository, $parameters);
    }

    private function get_issue_total_time(string $repository, int $id)
    {
        $times = $this->giteaClient->repositories()->issues()->times($this->organization, $repository, $id);
        $count = 0;
        foreach ($times as $time) {
            $count += (int) $time['time'];
        }

        return $count;
    }

    private function get_issue_labels(array $issue)
    {
        $labels = '';
        foreach ($issue['labels'] as $label) {
            $labels .= $label['name'] . ',';
        }
        return $labels;
    }

    private function create_columns(array $issue)
    {
        return array(
            'Progetto'  => $issue['repository']['name'],
            '#'         => $issue['number'],
            'Titolo'    => $issue['title'],
            'URL'       => $issue['html_url'],
            'Aperto_il' => $issue['created_at'],
            'Chiuso_il' => $issue['closed_at'],
            'Etichette' => $this->get_issue_labels($issue),
            'Tempo'     => gmdate('H:i:s', $this->get_issue_total_time($issue['repository']['name'], $issue['number']))
        );
    }

    private function create_csv(string $file_name, array $data)
    {
        $reader = new Spreadsheet();
        $spreadsheet = $reader->getActiveSheet();
        $headers = array_keys($data[0]);
        $data_new = array_unshift($data, $headers);
        $spreadsheet->fromArray(
            $data,
            null,
            'A1'
        );

        //dd($spreadsheet);
        $filename = $file_name . '.xls';

        $writer = new Xls($reader);
        $writer->save($filename);

        //Define header information
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header("Cache-Control: no-cache, must-revalidate");
        header("Expires: 0");
        header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
        header('Content-Length: ' . filesize($filename));
        header('Pragma: public');

        //Clear system output buffer
        flush();

        //Read the size of the file
        readfile($filename);

        unlink($filename);

        //Terminate from the script
        die();
    }

    private function date_to_datetime(string $date)
    {
        $date = str_replace('/', '-', $date);
        $datetime = new DateTime($date);

        return $datetime->format('Y-m-d H:i:s');
    }

    private function export_issues(string $from_date, string $to_date, array $issues_params)
    {
        $data = array();
        $repositories = $this->get_repositories();
        foreach ($repositories as $repository) {
            $issues = $this->get_issues($repository['name'], $issues_params);
            foreach ($issues as $issue) {
                $from_datetime = $this->date_to_datetime($from_date);
                $to_datetime = $this->date_to_datetime($to_date);
                if (substr($issue['closed_at'], 0, 19) > $from_datetime && substr($issue['closed_at'], 0, 19) <= $to_datetime) {
                    $data[] = $this->create_columns($issue);
                }
            }
        }

        if (count($data) > 0) {
            $file_name = $issues_params['state'] . "_issues_from_" . $from_date . "_to_" . $to_date;
            $this->create_csv($file_name, $data);
            return true;
        }
        return false;
    }

    public function export_closed_issues(Request $req)
    {
        if ($req->input('token') != getenv('GITEA_TOKEN')) {
            return redirect('/');
        }
        $from = $req->input('from_year') . '-' . $req->input('from_month') . '-01';
        $to = $req->input('to_year') . '-' . $req->input('to_month') . '-31';
        $res = $this->export_issues($from, $to, ['state' => $req->input('issues_type')]);

        return view('backend', [
            'token' => getenv('GITEA_TOKEN'),
            'download' => $res
        ]);
    }
}