from manim import DOWN, LEFT, RIGHT, UP, Circle, Create, FadeIn, FadeOut, Scene, Text, VGroup, CurvedArrow


class NetworkGraphExplainer(Scene):
    def construct(self):
        title = Text("Connections Optimizer", font_size=40).to_edge(UP)
        subtitle = Text("Prune low-signal follows. Strengthen warm paths.", font_size=20).next_to(title, DOWN)

        you = Circle(radius=0.45, color="#4F8EF7").shift(LEFT * 4 + DOWN * 0.5)
        you_label = Text("You", font_size=22).move_to(you.get_center())

        stale_a = Circle(radius=0.32, color="#7A7A7A").shift(LEFT * 1.6 + UP * 1.2)
        stale_b = Circle(radius=0.32, color="#7A7A7A").shift(LEFT * 1.2 + DOWN * 1.4)
        bridge = Circle(radius=0.38, color="#21A179").shift(RIGHT * 0.2 + UP * 0.2)
        target = Circle(radius=0.42, color="#FF9F1C").shift(RIGHT * 3.2 + UP * 0.7)
        new_target = Circle(radius=0.42, color="#FF9F1C").shift(RIGHT * 3.0 + DOWN * 1.4)

        stale_a_label = Text("stale", font_size=18).move_to(stale_a.get_center())
        stale_b_label = Text("noise", font_size=18).move_to(stale_b.get_center())
        bridge_label = Text("bridge", font_size=18).move_to(bridge.get_center())
        target_label = Text("target", font_size=18).move_to(target.get_center())
        new_target_label = Text("add", font_size=18).move_to(new_target.get_center())

        edge_stale_a = CurvedArrow(you.get_right(), stale_a.get_left(), angle=0.2, color="#7A7A7A")
        edge_stale_b = CurvedArrow(you.get_right(), stale_b.get_left(), angle=-0.2, color="#7A7A7A")
        edge_bridge = CurvedArrow(you.get_right(), bridge.get_left(), angle=0.0, color="#21A179")
        edge_target = CurvedArrow(bridge.get_right(), target.get_left(), angle=0.1, color="#21A179")
        edge_new_target = CurvedArrow(bridge.get_right(), new_target.get_left(), angle=-0.12, color="#21A179")

        self.play(FadeIn(title), FadeIn(subtitle))
        self.play(
            Create(you),
            FadeIn(you_label),
            Create(stale_a),
            Create(stale_b),
            Create(bridge),
            Create(target),
            FadeIn(stale_a_label),
            FadeIn(stale_b_label),
            FadeIn(bridge_label),
            FadeIn(target_label),
        )
        self.play(Create(edge_stale_a), Create(edge_stale_b), Create(edge_bridge), Create(edge_target))

        optimize = Text("Optimize the graph", font_size=24).to_edge(DOWN)
        self.play(FadeIn(optimize))
        self.play(FadeOut(stale_a), FadeOut(stale_b), FadeOut(stale_a_label), FadeOut(stale_b_label), FadeOut(edge_stale_a), FadeOut(edge_stale_b))
        self.play(Create(new_target), FadeIn(new_target_label), Create(edge_new_target))

        final_group = VGroup(you, you_label, bridge, bridge_label, target, target_label, new_target, new_target_label)
        self.play(final_group.animate.shift(UP * 0.1))
        self.wait(1)
