# -*- coding: utf-8 -*-
"""
クラスメソッドへの改変（SCard）
"""


# 学生証のクラス
class SCard:
    # コンストラクタ
    def __init__(self, id=0, name="匿名希望"):
        self.id   = id
        self.name = name

    # 学籍番号と氏名を表示するメソッド
    def print_info(self):
        print(f"{self.id:04d}, {self.name}")

    """ 指示１ここから """
    # このコメントブロックの下に，
    # 引数を持たず，SCardクラスの戻り値を持つインスタンスメソッド
    # clone_card() を宣言しなさい
    # 
    ### clone_card(self)
    # 自身が持つインスタンス変数 id, name に関して
    # 同様な変数を持つSCardクラスのインスタンスを新規生成
    # （つまりクローン）して戻す
    
    def clone_card(self):
        return SCard(self.id, self.name)
    
    """ 指示１ここまで """

    """ 次の課題での追記箇所ここから """
    # クラスメソッドのデコレーションを記述し，
    # cls を第１引数として追記
    # sc1, sc2 および戻り値の型アノテーションは文字列に
    @classmethod
    def compare_cards(cls, sc1:"SCard", sc2:"SCard") -> "SCard":
        if sc1.id > sc2.id:
            return sc2
        else:
            return sc1
    
    """ 次の課題での追記箇所ここまで """


def main():
    # インスタンス変数の直接の書き換えを避けるためにも
    # コンストラクタを利用
    id   = int(input("学籍番号（下４桁）："))
    name = input("氏名：")
    sc1 = SCard(id, name)
    print()  # 採点の都合上の空行

    # sc2 には sc1 を代入→同一のデータを参照
    sc2 = sc1
    # sc3 には sc1 のクローンを代入→異なるデータを参照
    sc3 = sc1.clone_card()

    # 見た目は全て等しくなる
    sc1.print_info()
    sc2.print_info()
    sc3.print_info()

    # sc2 の中身を書き換えてみる
    sc2.id   = 5000
    sc2.name = "仲間由紀恵"

    # sc1 の中身は書き換えていないはずなのに…
    print("更新後")
    sc1.print_info()
    sc2.print_info()
    sc3.print_info()

    # compare_cards() はSCardクラスのインスタンスが戻るので
    # そのまま続きでインスタンスメソッドも呼べる
    print("学籍番号が小さいのは")
    """ 次の課題での改変箇所ここから """
    # sc2 と sc3 を比較して id が小さい方を表示
    # クラスメソッドなので SCard を経由して呼ぶ
    SCard.compare_cards(sc2, sc3).print_info()
    """ 次の課題での改変箇所ここまで """



if __name__ == "__main__":
    main()
