from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress


def plot_phase_transition_alt(indir, outdir):
    files = [
        "size_20.txt",
        "size_40.txt",
        "size_60.txt",
        "size_80.txt",
        "size_100.txt",
        "size_500.txt",
    ]
    labels = ["L = 20", "L = 40", "L = 60", "L = 80", "L = 100", "L = 500"]

    figure1, ax1 = plt.subplots()
    figure2, ax2 = plt.subplots()
    figure3, ax3 = plt.subplots()
    figure4, ax4 = plt.subplots()
    figure5, ax5 = plt.subplots()

    # For linear regression
    L = []
    Tc = []
    size = 20

    for file, label in zip(files, labels):
        t = []
        e = []
        m = []
        CV = []
        X = []

        # Append the lattice size
        L.append(size)
        size += 20

        with open(Path(indir, file)) as f:
            lines = f.readlines()
            for line in lines:
                l = line.strip().split(",")
                t.append(float(l[0]))
                e.append(float(l[1]))
                m.append(float(l[2]))
                CV.append(float(l[3]))
                X.append(float(l[4]))

        # Append the critical temp for the current lattice size
        Tc.append(t[X.index(max(X))])

        ax1.plot(t, e, label=label)
        ax2.plot(t, m, label=label)
        ax3.plot(t, CV, label=label)
        ax4.plot(t, X, label=label)

    inv_L = list(map(lambda x: 1 / x, L))
    # Attempt linear regression
    x = np.linspace(0, 1 / 20, 1001)
    regression = linregress(inv_L, Tc)
    f = lambda x: regression[0] * x + regression[1]
    ax5.scatter(inv_L, Tc)
    ax5.plot(x, f(x), label=f"m = {regression[0]}, i = {regression[1]}")

    figure1.legend()
    figure2.legend()
    figure3.legend()
    figure4.legend()
    figure5.legend()

    figure1.savefig(Path(outdir, "energy.pdf"))
    figure2.savefig(Path(outdir, "magnetization.pdf"))
    figure3.savefig(Path(outdir, "heat_capacity.pdf"))
    figure4.savefig(Path(outdir, "susceptibility.pdf"))
    figure5.savefig(Path(outdir, "linreg.pdf"))

    plt.close(figure1)
    plt.close(figure2)
    plt.close(figure3)
    plt.close(figure4)
    plt.close(figure5)


def plot_phase_transition(indir, outdir):
    files = [
        "size_20.txt",
        "size_40.txt",
        "size_60.txt",
        "size_80.txt",
        "size_100.txt",
    ]
    labels = [
        "L = 20",
        "L = 40",
        "L = 60",
        "L = 80",
        "L = 100",
    ]

    figure1, ax1 = plt.subplots()
    figure2, ax2 = plt.subplots()
    figure3, ax3 = plt.subplots()
    figure4, ax4 = plt.subplots()
    figure5, ax5 = plt.subplots()

    # For linear regression
    L = []
    Tc = []
    size = 20

    for file, label in zip(files, labels):
        t = []
        e = []
        m = []
        CV = []
        X = []

        # Append the lattice size
        L.append(size)
        size += 20

        with open(Path(indir, file)) as f:
            lines = f.readlines()
            for line in lines:
                l = line.strip().split(",")
                t.append(float(l[0]))
                e.append(float(l[1]))
                m.append(float(l[2]))
                CV.append(float(l[3]))
                X.append(float(l[4]))

        # Append the critical temp for the current lattice size
        Tc.append(t[X.index(max(X))])

        ax1.plot(t, e, label=label)
        ax2.plot(t, m, label=label)
        ax3.plot(t, CV, label=label)
        ax4.plot(t, X, label=label)

    inv_L = list(map(lambda x: 1 / x, L))
    # Attempt linear regression
    x = np.linspace(0, 1 / 20, 1001)
    regression = linregress(inv_L, Tc)
    f = lambda x: regression[0] * x + regression[1]
    ax5.scatter(inv_L, Tc)
    ax5.plot(x, f(x), label=f"m = {regression[0]}, i = {regression[1]}")

    figure1.legend()
    figure2.legend()
    figure3.legend()
    figure4.legend()
    figure5.legend()

    figure1.savefig(Path(outdir, "energy.pdf"))
    figure2.savefig(Path(outdir, "magnetization.pdf"))
    figure3.savefig(Path(outdir, "heat_capacity.pdf"))
    figure4.savefig(Path(outdir, "susceptibility.pdf"))
    figure5.savefig(Path(outdir, "linreg.pdf"))

    plt.close(figure1)
    plt.close(figure2)
    plt.close(figure3)
    plt.close(figure4)
    plt.close(figure5)


if __name__ == "__main__":
    plot_phase_transition_alt(
        "fox_output/phase_transition/wide/10M/",
        "latex/images/phase_transition/fox/wide/10M/",
    )
    plot_phase_transition(
        "fox_output/phase_transition/wide/1M/",
        "latex/images/phase_transition/fox/wide/1M/",
    )
    plot_phase_transition(
        "fox_output/phase_transition/narrow/10M/",
        "latex/images/phase_transition/fox/narrow/10M/",
    )
    plot_phase_transition(
        "output/phase_transition/", "latex/images/phase_transition/hp/"
    )
    plot_phase_transition(
        "output/phase_transition/", "latex/images/phase_transition/hp/"
    )
    plot_phase_transition(
        "output/phase_transition/",
        "latex/images/phase_transition/hp/",
    )
