3
1-i!              z   @   s  d Z dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd	d	d	d	d	d
d
d
d
d
d
d
d
ddddddddddddddddddddyZdddddddddddddddZdd d!d"d#d$d%d&d'd(d)d*d+d,dZeed-d.d/Zeed-d0d1Zeeed2d3d4Z	e
d5krd6d7lZeejd8krejd8 Znd9ZeeZed:e  ed;ed<   ed=ed>   ed?ed@   ejdAredBedA   d7S )Ca  
UK Distribution Network Operator (DNO) Region Lookup

Maps UK postcodes to their electricity distribution region.
This is used to match users to the correct British Gas tariff rates.

There are 14 DNO regions in Great Britain + 1 in Northern Ireland:
- UK Power Networks: East, London, South East
- Western Power Distribution: East Midlands, West Midlands, South West, South Wales
- Electricity North West: North West England
- Northern Powergrid: North East, Yorkshire
- SP Energy Networks: Central/South Scotland (SP Distribution), Merseyside/North Wales (SP Manweb)
- SSE Networks: North Scotland (Scottish Hydro Electric)
- NIE Networks: Northern Ireland
	UKPN_EastUKPN_LondonUKPN_SouthEastWPD_EastMidlandsWPD_WestMidlandsWPD_SouthWestWPD_SouthWalesENWNPG_NorthEastNPG_YorkshireSPEN_SPDSPEN_Manweb	SSE_HydroNIE)yZCBZCOZCMZIPZNRZPEZSGZSSEZECNZNWZSEZSWWZWCZBRCRZDAZENZHAZIGKTZRMZSMZTWZUBZWDZBNZCTZGUZHPZMEZMKZOXZPOZRGZRHZSLSOZTNZLUALZDEZDNZLELNZNGZNNSBZCVZDYZHRZSTZTFZWRZWSZWVZBAZBHZBSZDTZEXZGLZPLZSNZSPZTAZTQZTRZCFZLDZNPZSAZSYZBBZBLCAZCWZFYLZLAMZOLZPRZSKZWAZWNZDHZDLZNEZSRZTSZBDZHGZHDZHUZHXZLSZWFZYOZDDZEHZFKGZKAZKYZMLZPAZTDZDGZCHZLLZABZIVZKWZPHZZEZHSZBTzUK Power Networks (East)zUK Power Networks (London)zUK Power Networks (South East)zWestern Power (East Midlands)zWestern Power (West Midlands)zWestern Power (South West)zWestern Power (South Wales)zElectricity North WestzNorthern Powergrid (North East)zNorthern Powergrid (Yorkshire)z$SP Energy Networks (SP Distribution)zSP Energy Networks (SP Manweb)zSSE Networks (Scottish Hydro)zNIE Networks (Northern Ireland))r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   zEast AngliaZLondonz
South EastzEast MidlandszWest Midlandsz
South WestzSouth Walesz
North Westz
North EastZ	YorkshirezCentral ScotlandZ
MerseysidezNorth ScotlandzNorthern Ireland)postcodereturnc             C   s:   | j ddj }d}x |D ]}|j r0||7 }qP qW |S )z
    Extract the postcode area (letters only) from a UK postcode.

    Examples:
        "HP20 1HP" -> "HP"
        "SW1A 1AA" -> "SW"
        "M1 1AA" -> "M"
        "NR3 3AF" -> "NR"
      )replaceupperisalpha)r   Zpostcode_cleanprefixchar r&   4/home/mac944/apps/billy-energy/scraper/dno_lookup.pyget_postcode_prefix   s    


r(   c             C   s   t | }|sddd|ddS tj|}|sbx6tt|dd
D ]"}|d| }|tkr<t| }P q<W |r|tj|dtj||dS ddd|d| d	dS dS )al  
    Get the DNO information for a given UK postcode.

    Args:
        postcode: UK postcode (e.g., "HP20 1HP", "M1 1AA")

    Returns:
        Dictionary with:
        - dno_code: Internal DNO code
        - dno_name: Human-readable DNO name
        - region: Region name used in tariff lookup
        - postcode_prefix: The postcode area used for matching
    NZUnknownzInvalid postcode format)dno_codedno_nameregionpostcode_prefixerror       )r)   r*   r+   r,   zPostcode area 'z' not found in DNO lookup)r(   POSTCODE_TO_DNOgetrangelen	DNO_NAMESDNO_TO_REGION)r   r$   r)   lengthZshorterr&   r&   r'   get_dno_for_postcode   s0    

r8   )r   available_regionsr   c             C   s2   t | }|jd}|r"||kr"|S |r.|d S dS )a  
    Find the best matching region from available cached regions.

    Args:
        postcode: User's postcode
        available_regions: List of region names we have tariff data for

    Returns:
        Best matching region name, or first available if no match
    r+   r.   N)r8   r2   )r   r9   dno_infoZuser_regionr&   r&   r'   find_matching_region   s    
r;   __main__r.   Nr/   zHP20 1HPz
Postcode: zPrefix: r,   zDNO: r*   zRegion: r+   r-   zError: )__doc__r1   r5   r6   strr(   dictr8   listr;   __name__sysr4   argvr   resultprintr2   r&   r&   r&   r'   <module>   s   5
