<?php

namespace App\Http\Controllers;

use App\Models\ProgramAppends;
use App\Models\Programs;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;

class ProgramAppendConstructController extends BaseController
{
    public function index(Request $request, Programs $program) {
        return view("program.construct.append.index", [
            "program" => $program,
            "appends" => $program->appends,
        ]);
    }

    public function add(Request $request, Programs $program) {
        $append = new ProgramAppends();
        if (sizeof($program->appends) === 0) {
            $append->is_original = 1;
        }
        return view("program.construct.append.create", [
            "program" => $program,
            "append" => $append
        ]);
    }

    public function create(Request $request, Programs $program) {
        $request->validate([
            "name" => ["required_without:is_original"],
            "from" => ["required"],
            "price" => ["required", "numeric"],
        ]);
        $createPayload = $request->only(["name", "from", "price", "append"]);
        $append = $program->appends()->create($createPayload);
        $append->is_original = $request->post("is_original", 0);
        $append->save();
        return redirect(route("program.construct.append.list", [
            "program"=>$program->id,
        ]));
    }

    public function edit(Request $request, ProgramAppends $append) {
        return view("program.construct.append.create", [
            "program" => $append->program,
            "append" => $append
        ]);
    }

    public function submit(Request $request, ProgramAppends $append) {
        $submitPayload = $request->only(["name", "from", "price", "append"]);
        $append->update($submitPayload);
        $append->is_original = $request->post("is_original", 0);
        $append->save();
        return redirect(route("program.construct.append.list", [
            "program"=>$append->program->id,
        ]));
    }

    public function from_list(Request $request) {
        $query = ProgramAppends::query()->groupBy("from")
            ->select("from")
            ->selectRaw("count(1) as total_count")
            ->having("total_count", ">", 1)
            ->orderByDesc("total_count");
        return $query->get()->map(function ($item) {
            return [
                "text" => $item["from"],
                "value" => $item["from"],
                "alias" => implode("", \pinyin($item["from"], PINYIN_NO_TONE)),
                "abbr" => \pinyin_abbr($item["from"]),
            ];
        })->toArray();
    }
}