# -*- coding: utf-8 -*-
"""
インスタンスとmutable型の注意点（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)
    
    """ 指示１ここまで """

    """ 次の課題での追記箇所ここから """

    """ 次の課題での追記箇所ここまで """


""" 次の課題での削除箇所ここから """
""" 指示２ここから """
# このコメントブロックの下に，
# SCardクラスの２つの引数を持ち，SCardクラスの戻り値を持つ関数
# compare_cards() を宣言しなさい
# 
### compare_cards(sc1, sc2)
# sc1 と sc2 の id を比較して小さい方（同値ならsc1）の
# SCardをそのまま戻す

def compare_cards(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 が小さい方を表示
    compare_cards(sc2, sc3).print_info()
    """ 次の課題での改変箇所ここまで """



if __name__ == "__main__":
    main()
