#!/usr/bin/env python3
"""
NameSilo DNS Manager - 用于管理 DNS 记录
"""

import os
import sys
import requests
import xml.etree.ElementTree as ET
from typing import List, Dict, Optional

class NameSiloDNSManager:
    """NameSilo DNS 管理器"""

    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://www.namesilo.com/api"

    def _make_request(self, operation: str, params: Dict = None) -> ET.Element:
        """发送 API 请求"""
        if params is None:
            params = {}

        params['version'] = '1'
        params['type'] = 'xml'
        params['key'] = self.api_key

        url = f"{self.base_url}/{operation}"

        try:
            response = requests.get(url, params=params, timeout=30)
            response.raise_for_status()

            root = ET.fromstring(response.content)

            # 检查响应状态
            reply_code = root.find('.//code')
            if reply_code is not None and reply_code.text != '300':
                detail = root.find('.//detail')
                error_msg = detail.text if detail is not None else 'Unknown error'
                raise Exception(f"API Error (Code {reply_code.text}): {error_msg}")

            return root

        except requests.exceptions.RequestException as e:
            raise Exception(f"Request failed: {e}")

    def list_domains(self) -> List[str]:
        """列出所有域名"""
        root = self._make_request('listDomains')
        domains = []

        for domain in root.findall('.//domain'):
            domains.append(domain.text)

        return domains

    def list_dns_records(self, domain: str) -> List[Dict]:
        """列出域名的 DNS 记录"""
        root = self._make_request('dnsListRecords', {'domain': domain})
        records = []

        for record in root.findall('.//resource_record'):
            records.append({
                'record_id': record.find('record_id').text,
                'type': record.find('type').text,
                'host': record.find('host').text,
                'value': record.find('value').text,
                'ttl': record.find('ttl').text,
                'distance': record.find('distance').text if record.find('distance') is not None else None
            })

        return records

    def add_dns_record(self, domain: str, record_type: str, host: str,
                       value: str, ttl: int = 3600, distance: int = None) -> str:
        """添加 DNS 记录"""
        params = {
            'domain': domain,
            'rrtype': record_type,
            'rrhost': host,
            'rrvalue': value,
            'rrttl': ttl
        }

        if distance is not None:
            params['rrdistance'] = distance

        root = self._make_request('dnsAddRecord', params)

        record_id = root.find('.//record_id')
        return record_id.text if record_id is not None else None

    def delete_dns_record(self, domain: str, record_id: str) -> bool:
        """删除 DNS 记录"""
        params = {
            'domain': domain,
            'rrid': record_id
        }

        self._make_request('dnsDeleteRecord', params)
        return True

def main():
    """主函数"""
    api_key = os.environ.get('NAMESILO_API_KEY')

    if not api_key:
        print("Error: NAMESILO_API_KEY environment variable not set")
        sys.exit(1)

    manager = NameSiloDNSManager(api_key)

    # 列出所有域名
    print("Fetching domain list...")
    domains = manager.list_domains()

    print(f"\nFound {len(domains)} domain(s):")
    for i, domain in enumerate(domains, 1):
        print(f"{i}. {domain}")

    # 保存域名列表到文件
    with open('/root/namesilo_domains.txt', 'w') as f:
        f.write("NameSilo Domains\n")
        f.write("="*60 + "\n")
        for domain in domains:
            f.write(f"{domain}\n")

    print(f"\nDomain list saved to: /root/namesilo_domains.txt")

    # 如果有域名，列出第一个域名的 DNS 记录作为示例
    if domains:
        domain = domains[0]
        print(f"\nDNS records for {domain}:")
        records = manager.list_dns_records(domain)

        for record in records:
            print(f"  {record['type']:6} {record['host']:30} -> {record['value']}")

if __name__ == "__main__":
    main()
