import re
import os 

from ..utils import judge_file

class MDFile:
    def __init__(self, path=None):
        """Base class for reading files generated by LAMMPS.

        Args:
            path (str, optional): path to the file. Defaults to None.
        """        
        self._set_path(path)
        self._get_cmd()
        

    def _set_path(self, path=None) -> None:
        if path is None:
            raise ValueError("path is None! Please provide a path to LAMMPS-generated file.")
        self.path = os.path.abspath(path)
        judge_file(self.path)
        print(f"You are processing the file: '{self.path}'")      
        
    
    
    def _get_cmd(self, line_num:int=1) -> None:
        """get the command used to generate the file

        Args:
            line (int, optional): the line number (start from ``1``) including command. Defaults to 1.
        """        
        # line参数是为了以后覆写此方法
        
        with open(self.path) as f:
            for i, line in enumerate(f, 1):  # enumerate()从1开始计数
                if i == line_num:
                    info = line
                    break
        
        out_flag=0
        
        if "Chunk-averaged".lower() in info.lower():
            out_flag = 'fix ave/chunk'
        elif "Time-averaged".lower() in info.lower():
            out_flag = 'fix ave/time'
        if out_flag:
            print(f"'{self.path}' is generated by command {out_flag}")
            print(f"The command line is: {info.strip('#').strip()}")
            
    
    
    def _get_header(self, line_num:int) -> list:
        """extract header from the line contents.
        
        Args:
            line_num (int, optional): the line number (start from ``1``) including headers.
        
        Returns:
            list: a list of the property names
            
        Notes:
            In generated files from LAMMPS command, the line including headers usually have the following format:
            ``# header1 header2 header3 ...``
            the return list : [header1, header2, header3, ...]
        """
        with open(self.path) as f:
            for i, line in enumerate(f.readlines(), 1): # enumerate(iterator,1) means counting from 1
                if i == line_num:
                    return re.split('\s+', line.strip())[1:] # split the line with regex '\s+' to list, and discard the first element "#"
    
                
    def read_file(self):
        """You need to override this method in the child class."""    
        pass




# class System:
#     def __init__(self, T=298.0, timestep=1.0) -> None:
#         """initialize the properties of system 

#         Args:
#             T (float, optional): temperature of system. Defaults to 298.0 [K].
#             timestep (float, optional): temperature you set in LAMMPS input file. Defaults to 1.0 [fs].
#         """     
#         self.T = T
#         self.timestep = timestep
#         print("---------------- System Properties --------------")
#         print(f"Temperature:\t{self.T} K")
#         print(f"Timestep:\t{self.timestep} fs")
#         print("-------------------------------------------------")