from qtpy import QtWidgets as QW

from hydrus.client import ClientConstants as CC
from hydrus.client import ClientStrings
from hydrus.client.gui import ClientGUIStringControls
from hydrus.client.gui.widgets import ClientGUICommon
from hydrus.client.metadata import ClientMetadataMigrationCore

class EditSidecarDetailsPanel( ClientGUICommon.StaticBox ):
    
    def __init__( self, parent: QW.QWidget ):
        
        ClientGUICommon.StaticBox.__init__( self, parent, 'sidecar filename' )
        
        self._sidecar_ext = 'txt'
        
        self._remove_actual_filename_ext = QW.QCheckBox( self )
        tt = 'If you set this, the actual filename\'s extension will not be used in the sidecar. For a txt sidecar, \'my_image.jpg\' will be matched with \'my_image.txt\'.'
        self._remove_actual_filename_ext.setToolTip( tt )
        
        self._suffix = QW.QLineEdit( self )
        tt = 'If you set this, the sidecar will include this extra suffix. For a txt sidecar, \'my_image.jpg\' will be matched with \'my_image.jpg.tags.txt\'.'
        self._suffix.setToolTip( tt )
        
        string_converter = ClientStrings.StringConverter()
        
        self._filename_string_converter = ClientGUIStringControls.StringConverterButton( self, string_converter )
        
        self._example_input = QW.QLineEdit( self )
        self._example_input.setText( 'my_image.jpg' )
        
        self._example_output = QW.QLineEdit( self )
        self._example_output.setReadOnly( True )
        
        rows = []
        
        rows.append( ( 'remove file .ext?: ', self._remove_actual_filename_ext ) )
        rows.append( ( 'optional suffix: ', self._suffix ) )
        rows.append( ( 'ADVANCED: final sidecar filename conversion: ', self._filename_string_converter ) )
        rows.append( ( 'Test media path: ', self._example_input ) )
        rows.append( ( 'Resulting sidecar path: ', self._example_output ) )
        
        gridbox = ClientGUICommon.WrapInGrid( self, rows )
        
        self.Add( gridbox, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR )
        
        self._remove_actual_filename_ext.clicked.connect( self._UpdateExample )
        self._suffix.textChanged.connect( self._UpdateExample )
        self._filename_string_converter.valueChanged.connect( self._UpdateExample )
        self._example_input.textChanged.connect( self._UpdateExample )
        
    
    def _UpdateExample( self ):
        
        path = self._example_input.text()
        remove_actual_filename_ext = self._remove_actual_filename_ext.isChecked()
        suffix = self._suffix.text()
        
        try:
            
            empty = ClientStrings.StringConverter()
            
            result = ClientMetadataMigrationCore.GetSidecarPath( path, remove_actual_filename_ext, suffix, empty, self._sidecar_ext )
            
            self._filename_string_converter.SetExampleString( result )
            
        except:
            
            pass
            
        
        filename_string_converter = self._filename_string_converter.GetValue()
        
        try:
            
            result = ClientMetadataMigrationCore.GetSidecarPath( path, remove_actual_filename_ext, suffix, filename_string_converter, self._sidecar_ext )
            
        except Exception as e:
            
            result = 'Error: {}'.format( e )
            
        
        self._example_output.setText( result )
        
    
    def GetRemoveActualFilenameExt( self ) -> bool:
        
        return self._remove_actual_filename_ext.isChecked()
        
    
    def GetSuffix( self ) -> str:
        
        return self._suffix.text()
        
    
    def GetFilenameStringConverter( self ) -> ClientStrings.StringConverter:
        
        return self._filename_string_converter.GetValue()
        
    
    def SetExampleInput( self, input: str ):
        
        self._example_input.setText( input )
        
        self._UpdateExample()
        
    
    def SetRemoveActualFilenameExt( self, remove_actual_filename_ext: bool ):
        
        self._remove_actual_filename_ext.setChecked( remove_actual_filename_ext )
        
    
    def SetSidecarExt( self, ext: str ):
        
        self._sidecar_ext = ext
        
        self._UpdateExample()
        
    
    def SetSuffix( self, suffix: str ):
        
        self._suffix.setText( suffix )
        
    
    def SetFilenameStringConverter( self, filename_string_converter: ClientStrings.StringConverter ):
        
        self._filename_string_converter.SetValue( filename_string_converter )
        
    

SEPARATOR_NEWLINE = 0
SEPARATOR_CUSTOM = 1

class EditSidecarTXTSeparator( ClientGUICommon.StaticBox ):
    
    def __init__( self, parent: QW.QWidget ):
        
        ClientGUICommon.StaticBox.__init__( self, parent, 'sidecar txt separator' )
        
        self._choice = ClientGUICommon.BetterChoice( self )
        
        self._choice.addItem( 'newline', SEPARATOR_NEWLINE )
        self._choice.addItem( 'custom text', SEPARATOR_CUSTOM )
        
        tt = 'You can separate the "rows" of tags by something other than newlines if you like. If you have/want a CSV list, try a separator of "," or ", ".'
        
        self._choice.setToolTip( tt )
        
        self._custom_input = QW.QLineEdit( self )
        
        rows = []
        
        rows.append( ( 'separator: ', self._choice ) )
        rows.append( ( 'custom: ', self._custom_input ) )
        
        gridbox = ClientGUICommon.WrapInGrid( self, rows )
        
        self.Add( gridbox, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR )
        
        self._choice.currentIndexChanged.connect( self._UpdateControls )
        
    
    def _UpdateControls( self ):
        
        value = self._choice.GetValue()
        
        self._custom_input.setEnabled( value == SEPARATOR_CUSTOM )
        
    
    def GetValue( self ):
        
        value = self._choice.GetValue()
        
        if value == SEPARATOR_NEWLINE:
            
            return '\n'
            
        else:
            
            return self._custom_input.text()
            
        
    
    def SetValue( self, value: str ):
        
        if value == '\n':
            
            self._choice.SetValue( SEPARATOR_NEWLINE )
            
        else:
            
            self._choice.SetValue( SEPARATOR_CUSTOM )
            self._custom_input.setText( value )
            
        
        self._UpdateControls()
        
    
